2011-06-22 192 views
2

我目前正在開發一個.net C#解決方案,該解決方案返回2個兄弟節點。使用XPath 1.0使用xPath獲取兄弟姐妹

我的XML文檔的一個小例子是這樣的:

<PLAY> 
<SCENE> 
    <SPEAKER> 
    </SPEAKER> 
    <LINE> 
    </LINE> 
    </SCENE> 
</PLAY> 

我使用下面的代碼來獲取線和揚聲器,但我不傳遞知道爲什麼我得到整個XML文檔在上而不只是兄弟(揚聲器)

我:

List speakers = new List(); 

XmlDocument myDoc = new XmlDocument(); 
myDoc.Load(textXMLFile.Text.ToString()); 
// Clear the text box... 
textResults.Text = ""; 

// ADD THIS... 
XPathNavigator theNav = myDoc.CreateNavigator(); 
XPathNavigator theNav2 = myDoc.CreateNavigator(); 

//XmlNodeList theNodes = 
// myDoc.SelectNodes(textXPath.Text.ToString()); 

textXPath.Text = "//SPEECH/LINE"; 
string val = "//SPEECH/SPEAKER"; 
XPathNodeIterator theNodes = theNav.Select(textXPath.Text.ToString()); 
XPathNodeIterator theNodes2 = theNav2.Select(val); 

StringBuilder output = new StringBuilder(); 

while (theNodes.MoveNext()) 
{ 
    if (theNodes.Current.InnerXml.ToString() == "Upon my sword.") 
    { 
     break; 
    } 
    else 
    { 
     speakers.Add(theNodes2.Current.InnerXml.ToString()); 
     speakers.Add(theNodes2.Current.InnerXml.ToString()); 
    } 
} 
for (int i =0; i < speakers.Count; ++i) 
{ 
    output.Append (speakers[i]+" "); 
} 
MessageBox.Show(""+output); 

theNodes.Current.InnerXml.ToString()工作正常,返回行,但theNodes2.Current.InnerXml.ToString()似乎返回整個XML而不是揚聲器。

任何意見或建議表示讚賞。

+1

其中'揚聲器。增加'行之一應該是'揚聲器。增加(theNodes.Current.InnerXml.ToString());'?現在他們都在使用'theNodes2'。 –

+0

在Xml中處於什麼水平? –

+0

我真的想出了它..我需要在我的while循環中循環Nodes2。謝謝大家。我會發佈一個答案,但我沒有足夠的代表來回答我自己的問題:( – Johnston

回答

1

在這盯着一段時間後,我完全錯過,我需要也動theNodes2 while循環,像這樣

while(theNodes2.MoveNext())

感謝所有

0

// SPEECH/LINE不會在元素被命名爲「播放」,「場景」,「揚聲器」和「行」的文檔中找到任何東西。請在制定問題時加倍小心。 Downvoting。

+0

對不起,我只是快速創建一個小的XML文件,因爲真正的事情是巨大的。它似乎沒有問題,因爲對於最部分人知道我在說什麼,但我想我會接受你的失望作爲建設性的批評 - 雖然我真的可以使用這些觀點,所以我可以更快地標記我的答案。 – Johnston