2017-02-16 4 views
1

私はWindowsフォームアプリケーションで作業しています特定のXMLノードに子ノードがあるかどうかを調べたいのですが、コードの最初の行にOpenFileDialogを使用してxmlファイルを開きます。ここではxmlサンプルを以下に示します。私のWindowsフォームアプリケーションでXMLNode。 HasChildは子ノードとしてInnerTextを考慮します

<bookstore> 
    <book category="cooking"> 
    <title lang="en">Everyday Italian</title> 
    <author>Giada De Laurentiis</author> 
    <year>2005</year> 
    <price>30.00</price> 
    </book> 
</bookstore> 

は、私がTextBox1テキストボックスは、XMLファイルのアドレスを表示するために使用され、オープンボタンは、運動のすべてを設定し、オープンボタンとTextBox1テキストボックスを持っています。どこかのコードで、私は次のコード行を持っている:

ここ
using System; 
using System.Data; 
using System.Windows.Forms; 
using System.Xml; 
using System.IO; 

//other lines of code 
private void Open_XML_button_Click(object sender, EventArgs e) 
{ 
//other lines of code 
XmlDocument xmldoc = new XmlDocument(); 
string XML_Location; 

XML_Location = textBox1.Text; 
xmldoc.Load(XML_Location); 

string category = "category = 'cooking'"; 
XmlNode test1 = xmldoc.SelectSingleNode(string.Format("/bookstore/book[@{0}]/author", category)); 

if (test1.HasChildNodes == true) 
         { 
          MessageBox.Show("It has Child nodes"); 
         } 

         else 
         { 
          MessageBox.Show("it does not have Child nodes"); 
         } 
} 

は、私は、私は、私の知る限り、子供を持たない著者のノードを指しています理解していないものです私のコードはそれがそうしていると述べています。私がGiada de Laurentiisを消してしまえば、私のコードは著者ノードにはないと言うでしょう

私は間違っていますか?

答えて

1

あなたはXmlNodeType.TextNodeTypeを持っていないすべての子ノードがあるかどうかをチェックすることができ:

string category = "category = 'cooking'"; 
XmlNode test1 = xmldoc.SelectSingleNode(string.Format("/bookstore/book[@{0}]/author", category)); 
if (test1.ChildNodes.OfType<XmlNode>().Any(x => x.NodeType != XmlNodeType.Text)) 
{ 
    MessageBox.Show("It has Child nodes"); 
} 
else 
{ 
    MessageBox.Show("it does not have Child nodes"); 
} 
+0

私はコードは、あなたがそれに加えた変更で機能するようになりましたと言って満足している、最後のものは、 'x => x.NodeType!= XmlNodeType.Text'は何をしていますか?それはラムダ演算子/式ですか? –

+0

はい、NodeTypeに基づいてChildNodesコレクションをフィルタするラムダ式で表される述語デリゲートです。https://msdn.microsoft.com/en-us/library/bfcke1bz(v=vs.110).aspx – mm8

関連する問題