Отформатированный XML
<status>
<webresponse>
<properties>
<props>
<imghandle>
<image handle=1234>
<imagetag>somewhere</imagetag>
</image>
</imghandle>
</props>
<props>
<imghandle>
<image handle=1235>
<imagetag>somewhere1</imagetag>
</image>
</imghandle>
</props>
</properties>
</webresponse>
</status>
Вышеприведенный пример xml, возвращенный мне участником thrid. Я пытаюсь использовать Linq для XMl для создания моего объекта, и я пытаюсь перейти к <imghandle>/<image handle=1234>
. Я могу сделать это с помощью Xpath, но когда я сделаю следующее, я получаю объект ref, не устанавливающий ошибку
from c in searchXMLResult.Descendants("props")
select c.Element("imghandle").Element("image").Attribute("handle");
PS: Я знаю, что мой xml не хорошо отформатирован для удобства чтения, как разместить разделы XML при задании здесь вопроса?
Обновление 1: Поэтому, после очень раздражающего третьего лица, я наконец получил ответ, говоря, что данные, которые я потреблял, устарели, и они дали мне новые форматированные данные, которые выглядят как это.
<status>
<webresponse>
<properties>
<props>
<imghandle>
<image handle="1234">
<imagetag>somewhere</imagetag>
</image>
</imghandle>
<owner>
<image handle="ABcf">
</image>
</owner>
</props>
</properties>
</webresponse>
</status>
Я попробовал предложение Кевина Тиге, посмотрю ниже предложения пользователя, и я получаю ошибку ref объекта. Не может ли тот же элемент под двумя разными разделами работать с Linq в XML? iee
from c in searchXMLResult.Descendants("props")
выберите c.Element( "imghandle" ). Элемент ( "изображение" ). Атрибут ( "handle" );
и/или
from c in searchXMLResult.Descendants("props")
выберите c.Element( "владелец" ). Элемент ( "изображение" ). Атрибут ( "дескриптор" )
Update2: Это xml, который я получаю и сохраняю на диске
<?xml version="1.0" encoding="utf-8"?>
<status>
<webresponse>
<properties>
<props>
<imghandle>
<image handle="537">
<imagetag>SFO</imagetag>
</image>
</imghandle>
<owner>
<image handle="User-2">
<firstname>
</firstname>
<lastname>Site Administrator</lastname>
<username>admin</username>
</image>
</owner>
<creationdate>2009-03-06T18:07:57Z</creationdate>
<summary>
</summary>
</props>
<status>HTTP/1.1 200 OK</status>
</properties>
</webresponse>
</status>
Код ниже работает для меня, как только я помещаю кавычки вокруг значений атрибута "handle":
XDocument xdoc = XDocument.Parse(@"
<status>
<webresponse>
<properties>
<props>
<imghandle>
<image handle='1234'>
<imagetag>somewhere</imagetag>
</image>
</imghandle>
</props>
<props>
<imghandle>
<image handle='1235'>
<imagetag>somewhere1</imagetag>
</image>
</imghandle>
</props>
</properties>
</webresponse>
</status>
");
var v = from c in xdoc.Descendants("props")
select c.Element("imghandle").Element("image").Attribute("handle");
EDIT: без изменения ввода, чтобы сделать xml действительным, я не знаю, что вы можете сделать с объектами XDocument или XmlDocument. Оба будут генерировать исключения, если вы попытаетесь загрузить недопустимый xml.
EDIT2: второй пример xml все еще недействителен:( Тег <image handle='ABcf'>
не закрыт.