Чтение сложных XML в C # - PullRequest
       30

Чтение сложных XML в C #

1 голос
/ 12 июля 2011

Я пытаюсь прочитать XML-файл, формат файла следующий:

<rootnode>
<a>first<b>1st</b></a>
<a>second<b>2nd</b></a>
</rootnode>

Я пытался использовать XDocument так:

XDocument loadedData = XDocument.Load("file.xml");
        var data = from query in loadedData.Descendants("a")
                   select new myClass
                   {
                       Word = (string)query.Value,
                       secondWord = (string) query.Element("b")
                   };

но это не сработало, как (строковый) запрос. Значение принесет мне всю строку; "first 1st "

есть ли способ получить текст вместо целого элемента?

Ответы [ 2 ]

1 голос
/ 12 июля 2011

На самом деле я не в состоянии много исследовать «правильный» способ обработки этого в XML, но как насчет того, если бы вы произвели некоторые манипуляции со строками в результате?

 var data = from query in loadedData.Descendants("a")
     select new myClass
     {
         Word = (string)query.Value.Substring(0, ((string)query.Value).Length - ((string)query.Element("b").Value).Length),
         secondWord = (string)query.Element("b")
     };

Уродливо, но это работает.Я уверен, что есть «лучший» способ, но, как я уже сказал, у меня недостаточно пропускной способности, чтобы разобраться в этом.

РЕДАКТИРОВАТЬ

Как я упоминал в комментарии к первоначальному вопросу, если вы в первую очередь контролируете написание XML, было бы лучше переформатировать его - возможно, так.

<rootnode>
  <item><a>first</a><b>1st</b></item>
  <item><a>second</a><b>2nd</b></item>
</rootnode>

Это не толькопозволяет вам привести в порядок код, чтобы получить чистые значения, но позволяет гибко добавлять больше элементов данных в каждый элемент, если это необходимо.например,

<rootnode>
  <item><a>first</a><b>1st</b><c>primary</c></item>
  <item><a>second</a><b>2nd</b><c>secondary</c></item>
</rootnode>
0 голосов
/ 12 июля 2011

Вам нужно поменять своих потомков на "rootnode", а не на "a".Попробуйте это:

XDocument loadedData = XDocument.Load("file.xml");
var data = (from query in loadedData.Descendants("rootnode")
    select new myClass
    {
        Word  = (string)query.Element("a"),
        secondWord  = ((string)query.Element("b"))
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...