使用 XElement 解析 XML

Posted

技术标签:

【中文标题】使用 XElement 解析 XML【英文标题】:XML parsing using XElement 【发布时间】:2012-02-23 18:59:36 【问题描述】:

似乎找不到如何使用 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&lt;Message&gt;,而现在它是一个匿名类型的列表。

【讨论】:

【参考方案2】:

XElement 中,Descendants() 是我使用的唯一方法,它使用 LINQ 给出结果。

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

【讨论】:

以上是关于使用 XElement 解析 XML的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XxmlElement 而不是 C# 中的 XElement 上运行 linq

获取 XElement 的 InnerXml 的最佳方法?

使用 XElement 解析 XML

是否存在可二进制序列化的 XML 特定对象(如 XElement)?

如何使用 XElement.Parse 解析 XML 而无需查看/将实体更改为字符?

使用 C# 和 XDocument/XElement 解析 Soap 响应