2011-06-22 12 views
2

現在、2つの兄弟ノードを返す.net C#ソリューションを開発中です。 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

これらの 'speakers.Add'行は' speakers.Add(theNodes.Current.InnerXml.ToString()); 'になりますか?今は両方とも 'theNodes2'を使っています。 –

+0

Xmlのはどのレベルですか? –

+0

私は実際にそれを理解する。私はwhileループでtheNodes2もループする必要があった。皆さんありがとう。私は答えとして投稿するが、私は自分の質問に答えるのに十分な担当者がいない:( – Johnston

答えて

1

しばらくの間、この見つめて後、私は完全に私はすべての

0

// SPEECH/LINEをするつもりはないので、

while(theNodes2.MoveNext())

おかげのようなwhileループでもtheNodes2を動かすのに必要なことを逃しました要素が「再生」、「シーン」、「スピーカー」、および「線」と命名された文書内のものを見つける。あなたの質問を定式化する際には、さらに注意してください。ダウン投票。

+0

私はちょうど実際のものが大規模なので、すぐに小さなXML文書を作成していた。一部の人々は私が話していたことを知っていましたが、私は建設的な批判としてあなたのdownvoteを受け入れるでしょう - 私は実際にポイントを使用することができますので、 – Johnston

関連する問題