2016-04-26 84 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