Синтаксический анализ 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();