2014-09-04 42 views
0

我的下一個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

回答

0

您的XPath應該是"./Start/MetricValue",因爲"//"表示它將搜索節點樹以查找在前一個節點下的任何匹配項。

鏈接到語法的cheatsheet:W3Schools - XPath Syntax

+0

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

0

您可以使用該方法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