【问题标题】:Best way to query XML in C# - using LINQ, etc在 C# 中查询 XML 的最佳方法 - 使用 LINQ 等
【发布时间】:2012-02-07 02:29:57
【问题描述】:

我有一条需要解析的 xml 消息(不控制格式),它看起来类似于我需要处理的以下(名称/值对)。查询 Name = x 的值并获取相关值的最佳方法是什么?

我目前正在使用嵌套选择来尝试从特定的名称/值对中获取值。只是想知道我是否可以使用更简单的 LINQ / Lambda 调用。

任何建议将不胜感激。

<Message>
<MessageContent>
  <MessageDetails>
    <Name>System_ID</Name>
    <Value>12345</Value>
  </MessageDetails>
  <MessageDetails>
    <Name>System_Name</Name>
    <Value>Test System</Value>
  </MessageDetails>
</MessageContent>
</Message>

【问题讨论】:

    标签: c# xml linq


    【解决方案1】:

    使用 Linq to XML:

    var xml = XElement.Load(someXmlFile);
    var results = xml.Descendants("MessageDetails")
                     .Where(m => m.Element("Name").Value == someValue)
                     .Select(m => m.Element("Value").Value);
    

    如果您希望只有一个匹配项,请添加 FirstOrDefault() 以获取第一个匹配值。

    从您的 xml 来看,您似乎也可以从投影到字典中受益(如果您的 Name 元素值是唯一的):

    var dictionary = xml.Descendants("MessageDetails")
                        .ToDictionary(x => x.Element("Name").Value, 
                                      x => x.Element("Value").Value);
    

    现在你可以使用字典了:

    string value = dictionary["System_ID"];  
    

    【讨论】:

    • 谢谢@BrokenGlass 我会看看谢谢你的回复
    • 为什么 StackOverflow 上使用 LINQ-to-XML 的每个答案都涉及.Descendants?当已知元素是根元素的子元素时,为什么要递归地在整个文档中搜索这些元素?只是想知道......
    • @dtb:这是一个公平的批评 - 原型更​​容易/更短,对你的 xml 结构的假设更少,但对于大型 xml 文档,它会有所作为
    【解决方案2】:

    如果您无法控制格式,并且将来可能会更改,我也会考虑using XPath,这样您就可以通过更少的代码更改来修改您的选择。例如,获取系统 ID 的 XPath 将是:

    //MessageContent/MessageDetails[Name='System_Name']/Value

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 2012-01-07
      • 2011-05-09
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多