2016-04-27 65 views
1
<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> 
    <Results> 
     <Data1> 
      <a>-50</a> 
      <b>600</b> 
     </Data1> 
     <Data2> 
      <MoreData> 
        <c>2</c> 
        <d>300</d> 
      </MoreData> 
      <MoreData> 
        <c>6</c> 
        <d>900</d> 
      </MoreData> 
     </Data2> 
    </Results> 
</OverallReport> 

我有一个XML文档,如上所述,它包含任意数量的结点节点和任意数量的MoreData节点。我必须找到包含两个特定值(例如a = -50,b = 600)的结果节点,如果'c'等于特定值,则在该节点内找到'd'的值。同时,也有可能具有相同的A,B和C的各种结果的节点,我需要找到的“X”之一。所以,如果(a = -50,b = 600,c = 6,x = 0),我正在寻找的d的值是500。若(a = -50,B = 600,C = 6,X = 1),d的我正在寻找的值是900根据节点在xml文档中的位置查找元素的值

我有一个相关的问题贴出来,与合作的答案,但是这是更高级一点,所以我决定创建一个新的问题。我目前发现d的方式:

string wantedA = "-50"; 
string wantedB = "600"; 
string wantedC = "6"; 
string x=1; 

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

同样,我是Xml的新手,任何帮助或提示都将不胜感激!

回答

1

首先,有在你的XML一些错误,应该是:

<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> // was <Data2> - slash added 
    </Results> 
    <Results> 
     <Data1> 
      <a>-50</a> 
      <b>600</b> 
     </Data1> 
     <Data2> 
      <MoreData> 
        <c>2</c> 
        <d>300</d> 
      </MoreData> 
      <MoreData> 
        <c>6</c> 
        <d>900</d> 
      </MoreData> 
     </Data2> // was <Data2> - slash added 
    </Results> 
</OverallReport> 

其次,你必须从string改变x类型int

string wantedA = "-50"; 
string wantedB = "600"; 
string wantedC = "6"; 
int x = 1; // or 0 

最后,你应该找到符合您的条件的所有节点,然后选择一个依赖于x

XmlNodeList nodes = doc.SelectNodes(xpath);    
Console.WriteLine(nodes[x].InnerText); 

所以,你的代码应该是:

string wantedA = "-50"; 
    string wantedB = "600"; 
    string wantedC = "6"; 
    int x = 1; // or 0 

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

    XmlNodeList nodes = doc.SelectNodes(xpath);    
    Console.WriteLine(nodes[x].InnerText); 
+0

太谢谢你了! – Faye

1

裹在括号整个XPath和应用位置索引过滤器/谓词,例如:

(OverallReport/Results[Data1/a=-50 and Data1/b=600]/Data2/MoreData[c=6]/d)[2] 

注意XPath索引从1,而不是开始0像在C#中一样。所以上面的XPath表达式将问题回归900给定的样本XML作为测试文档。

+0

非常感谢! – Faye

相关问题