C#XML解析的SelectNodes

问题描述:

我的下一个XML代码:C#XML解析的SelectNodes

<Start> 
     <MetricValue> 
        <Name>Name1</Name> 
        <Value>1</Value> 
     </MetricValue> 
     <MetricValue> 
        <Name>Name1</Name> 
        <Value>1</Value> 
     </MetricValue> 
     <Test> 
      <MetricValue> 
          <Name>Name1</Name> 
          <Value>1</Value> 
      </MetricValue> 
      <MetricValue> 
          <Name>Name1</Name> 
          <Value>1</Value> 
      </MetricValue> 
     </Test> 
</Start> 

我试图解析只有第2分量值,而不是从“测试”标签之间。

XmlNodeList nlMetricValues = xmlDoc.SelectNodes("//Start//MetricValue"); 
foreach (XmlNode nMetricValue in nlMetricValues) 
{ 
     Console.WriteLine("\Name: " + nMetricValue.SelectSingleNode(".//Name").InnerText); 
     Console.WriteLine("\tValue: " + nMetricValue.SelectSingleNode(".//Value")).InnerText); 
} 

但是这个foreach解析所有的度量值。我该怎么做才能解决这个问题?

+0

请添加用于选择MetricValue节点,因为这是哪里的问题可能是XPath。 – toadflakz 2014-09-04 07:52:44

+0

完成。我也添加了xmlnode – 2014-09-04 07:54:15

您的XPath应该是"./Start/MetricValue",因为"//"表示它将搜索节点树以查找在前一个节点下的任何匹配项。

链接到语法的cheatsheet:W3Schools - XPath Syntax

+0

谢谢。正在工作:) – 2014-09-04 08:06:52

您可以使用该方法XElement类的Elements()。它将只加载MetricValue元素是Start元素的子元素:

var xml = @" 
<Start> 
    <MetricValue> 
     <Name>Name1</Name> 
     <Value>1</Value> 
    </MetricValue> 
    <MetricValue> 
     <Name>Name1</Name> 
     <Value>1</Value> 
    </MetricValue> 
    <Test> 
     <MetricValue> 
      <Name>Name1</Name> 
      <Value>1</Value> 
     </MetricValue> 
     <MetricValue> 
      <Name>Name1</Name> 
      <Value>1</Value> 
     </MetricValue> 
    </Test> 
</Start>"; 

var metricValues = XElement.Parse(xml).Elements("MetricValue"); 
+0

不应该是'XElement.Parse(xml).Element(“Start”)。Elements(“MetricValue”);'? – toadflakz 2014-09-04 07:59:31

+0

@toadflakz,不,不是真的。这里的根元素是'Start',所以你不需要再调用'Element()'方法。 – RePierre 2014-09-04 11:09:29

+0

对吗?我一直使用'XDocument.Parse()',并且需要额外的'Element()'调用,这就是为什么我查询它 - 显然'XElement.Parse()'返回'XElement',而不是'XDocument'!哎呀! – toadflakz 2014-09-04 11:51:44