基于各种元素值使用xpath搜索xml

时间:2016-04-26 11:52:35

标签: c# xml xml-parsing

<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的新手,所以也许有些东西我会忽略。

1 个答案:

答案 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);