Синтаксический анализ XML с использованием XElement - PullRequest
5 голосов
/ 01 февраля 2012

Не могу найти, как правильно проанализировать это с помощью XElement:

<messages>
  <message subclass="a" context="d" key="g">
  <message subclass="b" context="e" key="h">
  <message subclass="c" context="f" key="i">
</messages>

Я хотел бы вынести это в список, где есть три строки подкласс, контекст, ключ.

Ответы [ 2 ]

23 голосов
/ 01 февраля 2012

Ваш ввод не является допустимым XML, в нем отсутствуют закрывающие теги на внутренних элементах сообщения.Но, предполагая, что формат действителен, вы можете проанализировать свою структуру следующим образом:

string xml = @"<messages> 
                  <message subclass=""a"" context=""d"" key=""g""/> 
                  <message subclass=""b"" context=""e"" key=""h""/> 
                  <message subclass=""c"" context=""f"" key=""i""/> 
               </messages>";

var messagesElement = XElement.Parse(xml);
var messagesList = (from message in messagesElement.Elements("message")
                   select new 
                    {
                        Subclass = message.Attribute("subclass").Value,
                        Context = message.Attribute("context").Value,
                        Key = message.Attribute("key").Value
                    }).ToList();

Вы также можете использовать XDocument для полного XML-документа и использовать метод Load вместо Parseнапример, если вы используете файл или поток XML.Кроме того, вы можете выбрать конкретный класс, если он у вас есть.Учитывая определение класса

class Message 
{
    public string Subclass { get; set; }
    public string Context { get; set; } 
    public string Key { get; set; }
}

Вы можете использовать select new Message в запросе, и результатом будет List<Message>, тогда как сейчас это список анонимного типа.

0 голосов
/ 21 февраля 2019

In XElement, Descendants() - единственный метод, который я использую, и он дает результаты с использованием LINQ.

var abc = doc.Descendants()
    .Where(t => t.Name.LocalName == "pqr")
    .Select(t => t.Value)
    .FirstOrDefault();
...