<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文档,如上所述,它包含任意数量的Results节点和任意数量的MoreData节点。我必须找到包含两个特定值的结果节点(例如a = -50,b = 600),并且在该节点内,如果'c'等于特定值,则找到'd'的值。
基本上,如果a = -50,b = 600,c = 6,那么d(它的兄弟)的值是多少。
我正在尝试使用XPath执行此操作。到目前为止,这就是我所拥有的:
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;
}
}
我尝试的所有东西都没有给我我需要的东西,因为所有D的XPath是相同的。我是XML的新手,所以也许有些东西我会忽略。
答案 0 :(得分: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);