LINQ для XML с C # и VS2008

2

Отформатированный 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>
  • 0
    Я пошел дальше и отформатировал XML. Лучший способ сделать это - выбрать диапазон, который вы хотите отформатировать, и нажать CTRL + K.
Теги:
linq

1 ответ

2

Код ниже работает для меня, как только я помещаю кавычки вокруг значений атрибута "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'> не закрыт.

  • 0
    У меня были такие же результаты
  • 0
    Это здорово, но ОП, похоже, не контролирует ввод. Есть ли способ сделать это без изменения ввода?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню