在C#中查询XML的最佳方法 - 使用LINQ等

3

我有一个需要解析的 XML 消息(格式无法控制),看起来类似于以下的名称/值对,我需要处理。当名称为 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>
2个回答

7

使用 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"];  

为什么 StackOverflow 上每个使用 LINQ-to-XML 的答案都涉及 .Descendants?当已知元素是根元素的子元素时,为什么要递归搜索整个文档以查找它们?只是好奇... - dtb
@dtb:这是一个公正的批评 - 它更容易/更短地进行原型设计,并且对您的 XML 结构做出的假设较少,但是对于大型 XML 文档来说,这将产生影响。 - BrokenGlass

-1

如果您无法控制格式,并且将来有可能更改,请考虑使用XPath,这样您可以通过较少的代码更改修改您的选择。例如,要获取系统ID的XPath为:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接