2016-04-27 63 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

相關問題