2010-09-02 83 views
3

下面的代碼給了我一個節點列表,以itterate在抓住一個節點列表:從節點列表C#.NET

XPathNavigator thisNavigator = thisXmlDoc.CreateNavigator(); 
XPathNodeIterator dossierNodes = thisNavigator.Select("changedthisname/dossiers/dossier"); 

我處理這個節點列表,我需要抓住另一個節點列表了這個名單。 我試圖通過使用此代碼來做到這一點:

XPathNavigator alineanodesNavigator = dossierNodes.Current; 
XPathNodeIterator alineaNodes = alineanodesNavigator.Select("/dossier/alineas/alinea"); 

我使用這個代碼,而內(dossierNodes.MoveNext())循環,並希望這個節點列表與所有「allinea的」被填滿。但是我沒有得到任何結果回我的alineaNodes迭代器。

文檔結構是這樣的:

alt text

如何從當前檔案節點的節點ALINEA?

我調試,這出來:

alt text

Stream responseStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8); 
    string xml = reader.ReadToEnd(); 
    XmlDocument thisXmlDoc = new XmlDocument(); 
    thisXmlDoc.LoadXml(xml); 

    XPathNavigator thisNavigator = thisXmlDoc.CreateNavigator(); 

回答

3

正確的完整路徑是

changedthisname/dossiers/dossier/alineas/alinea 

因此,如果您選擇changedthisname/dossiers/dossier第一,那麼相對路徑是:

alineas/alinea 
+0

是的,我認真地嘗試過,但它根本不起作用。我甚至調試了這一切,我不知道爲什麼這不起作用。不過,我已經解決了這個問題:)。感謝您的幫助。 – Younes 2010-09-03 08:25:02

+0

+1爲唯一正確的答案。 – 2010-09-03 12:25:22

+0

答案是根據我也正確的,但不知何故,我無法得到這個表達式的列表;)。無論如何,你是對的,我已經嘗試過這一個。你明白了。 – Younes 2010-09-06 08:01:28

2

您已經在檔案節點,所以當你把一個「/」在XPath查詢你的開始說「從父節點」,這恰好已經是檔案節點在這一點上。您的XPath查詢更改爲:

編輯:

看到你的輸出後,我意識到我的錯誤。您應該放棄原始查詢中的前導斜槓。

「檔案/ alineas/ALINEA」

這應該做的伎倆。

+0

我不知道爲什麼,但這並不能解決問題。它說這不會帶來任何結果。 – Younes 2010-09-02 13:32:23

+0

和@Younes:檢查我的答案是否有正確的相對路徑。 – 2010-09-02 16:25:25

-1

Linq to XML非常適合這種情況。

var alineaNodes = from alinea in XDocument.Load(alldata.xml).Descendents("alinea") 
        select alinea; 

返回一個IEnumerable與alldata.xml中的所有元素。希望這可以幫助。真正考慮Linq對於這些事情是很棒的。

+0

我不想要一個包含所有alineaNodes的列表,因爲我在處理當前項目的迭代器中。我需要將alineas添加到我當前的工作列表中。 – Younes 2010-09-02 13:33:00

+0

您可以將XDocument.Load(alldata.xml)更改爲您需要的任何列表,XML文檔或數據庫。然後,您可以將後綴(「aliena」)的部分調整爲您的列表中需要的任何方法,以便查看其中包含的各個元素。在這種情況下,Linq確實具有所有你想要的功能。您還可以向其添加條件(例如,在選擇之前添加where語句)。 – Adkins 2010-09-02 13:38:21

+0

好的,謝謝,我會盡快去嘗試它。如果它有效,你會得到分數;)。 – Younes 2010-09-02 13:40:48

0

好的,我已經解決了這個問題。

,而不是試圖通過使用XPath我就用我的節點導航的SelectDescendants像得到ALINEA的什麼位置:

  XPathNavigator alineanodesNavigator = dossierNodes.Current; 
      XPathNodeIterator alineaNodes = alineanodesNavigator.SelectDescendants("alinea", "", false); 


      List<Alinea> thisAlineaList = new List<Alinea>(); 
0

在最後通話到Select(),請使用以下XPath表達式:"//alinea"

下面的代碼片段遍歷alineas:

 XPathNavigator thisNavigator = doc.CreateNavigator(); 
     XPathNodeIterator dossierNodes = thisNavigator.Select("//dossier"); 
     while (dossierNodes.MoveNext()) 
     { 
      XPathNavigator alineanodesNavigator = dossierNodes.Current; 
      XPathNodeIterator alineaNodes = alineanodesNavigator.Select("//alinea"); 

      while (alineaNodes.MoveNext()) 
      { 

      } 
     } 
+0

是的,這是我做的;)。 – Younes 2010-09-03 08:24:11