Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C查询XML的最佳方法-使用LINQ等_C#_Xml_Linq - Fatal编程技术网

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

C# 用C查询XML的最佳方法-使用LINQ等,c#,xml,linq,C#,Xml,Linq,我有一条xml消息,我需要解析它,而不需要对格式进行控制,它看起来像我需要处理的下面的名称/值对。查询Name=x处的值并获取相关值的最佳方法是什么 我目前正在使用嵌套选择来尝试从特定的名称/值对中获取值。只是想知道我是否可以用一个更简单的LINQ/Lambda电话来代替 如有任何建议,将不胜感激 <Message> <MessageContent> <MessageDetails> <Name>System_ID</Name&g

我有一条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>
使用Linq转换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判断,如果名称元素值是唯一的,您还可以从映射到字典中获益:

var dictionary = xml.Descendants("MessageDetails")
                    .ToDictionary(x => x.Element("Name").Value, 
                                  x => x.Element("Value").Value);
现在,您可以使用字典:

string value = dictionary["System_ID"];  

如果你对格式没有控制,而且将来可能会改变,我也会考虑,所以你可以用更少的代码修改来修改你的选择。例如,获取系统ID的XPath是:

//MessageContent/MessageDetails[Name='System_Name']/Value
谢谢@BrokenGlass我会看一看谢谢你的回答为什么使用LINQ到XML的StackOverflow上的每个答案都涉及.subjects?既然知道元素是根元素的子元素,为什么要递归地搜索整个文档中的元素呢?只是想知道…@dtb:这是一个公平的批评——原型制作更容易/更短,对xml结构的假设更少,但对于大型xml文档来说,这会有所不同