Синтаксический анализ XML с использованием XElement

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

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

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

1 ответ

Решение

Ваш ввод не является допустимым 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>тогда как сейчас это список анонимного типа.

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

var abc = doc.Descendants()
    .Where(t => t.Name.LocalName == "pqr")
    .Select(t => t.Value)
    .FirstOrDefault();
Другие вопросы по тегам