2016-04-26 80 views
2
<OverallReport> 
    <Results> 
     <Data1> 
      <a> -30 </a> 
      <b> 400 </b> 
     </Data1> 
     <Data2> 
      <MoreData> 
        <c> 2 </c> 
        <d> 100 </d> 
      </MoreData> 
      <MoreData> 
        <c> 4 </c> 
        <d>200</d> 
      </MoreData> 
     </Data2> 
    </Results> 
    <Results> 
     <Data1> 
      <a> -50 </a> 
      <b> 600 </b> 
     </Data1> 
     <Data2> 
      <MoreData> 
        <c> 2 </c> 
        <d> 200 </d> 
      </MoreData> 
      <MoreData> 
        <c> 6 </c> 
        <d>500</d> 
      </MoreData> 
     <Data2> 
    </Results> 
</OverallReport> 

我有一個XML文檔,如上所述,它包含任意數量的結點節點和任意數量的MoreData節點。我必須找到包含兩個特定值(例如a = -50,b = 600)的結果節點,如果'c'等於特定值,則在該節點內找到'd'的值。所以基本上,如果a = -50,b = 600,c = 6,那麼d(它是兄弟)的值是多少。使用基於各種元素值的xpath搜索xml

我想用XPath做到這一點。到目前爲止,這裏是我的。我已經試過不給我我需要什麼,因爲XPath的所有D的

var resultsNodes = document.SelectNodes(「OverallReport/Results」); 
var data1ANodes = document.SelectNodes(「OverallReport/Results/Data1/a」); 
var data1BNodes = document.SelectNodes(「OverallReport/Results/Data1/b」); 

var data2CNodes = document.SelectNodes(「OverallReport/Results/Data2/c」); 
var data2DNodes = document.SelectNodes(「OverallReport/Results/Data2/d」); 

string wantedA = 「-50」; 
string wantedB = 「600」; 
string wantedC = 「6」; 
string wantedD = "500"; 

for (int i=0; i<resultsNodes.Count; i++) 
{ 
    if (data1Anodes[i].InnerXml == wantedA && data1Bnodes[i].InnerXml == wantedB) 
    { 
     //do something. 
     //the goal is to compare the output of D with wantedD 
     i = resultsNodes.Count; 
    } 
} 

一切都是一樣的。我對XML很陌生,所以也許我會忽略一些東西。

回答

2
string wantedA = "-50"; 
string wantedB = "600"; 
string wantedC = "6"; 

string xpath = string.Format("OverallReport/Results[Data1/a={0} and Data1/b={1}]/Data2/MoreData[c={2}]/d", 
    wantedA, wantedB, wantedC); 

XmlNode nodeD = document.SelectSingleNode(xpath); 
Console.WriteLine(nodeD.InnerText); 
+0

我非常愛你,亞歷山大!這比我想象的要簡單得多。謝謝!!!!! – Faye

+0

順便說一句,我發佈了一個新的問題,因爲有一個額外的層(這將有多個匹配a,b,c的,我必須找到第x個)。 – Faye