C# XMLNode。HasChild将InnerText视为子节点

C# XMLNode。HasChild将InnerText视为子节点,c#,xml,xmlnode,C#,Xml,Xmlnode,我正在开发一个windows窗体应用程序,我试图查看某个xml节点是否有子节点,在我的代码的第一行中,我使用OpenFileDialog打开了一个xml文件;在本例中,使用下面的xml示例 <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</

我正在开发一个windows窗体应用程序,我试图查看某个xml节点是否有子节点,在我的代码的第一行中,我使用OpenFileDialog打开了一个xml文件;在本例中,使用下面的xml示例

<bookstore>
   <book category="cooking">
     <title lang="en">Everyday Italian</title>
     <author>Giada De Laurentiis</author>
     <year>2005</year>
     <price>30.00</price>
   </book>
</bookstore>
这是我不理解的,我指向作者节点,据我所知,它没有子节点,但我的代码声明它有;如果我删除了Giada de Laurentiis,那么我的代码会说author节点没有


我做错了什么?

它有一个子节点,它是
XmlText
的一个实例。在DOM中有不同类型的节点,属性
HasChildNodes
检查任何类型的子节点(元素、注释、处理指令、文本、cdata)。

您可以检查是否有任何子节点没有
XmlNodeType.text的
NodeType

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");
}
string category=“category=‘烹饪’”;
xmlnodetest1=xmldoc.SelectSingleNode(string.Format(“/bookstore/book[@{0}]/author”,category));
if(test1.ChildNodes.OfType().Any(x=>x.NodeType!=XmlNodeType.Text))
{
Show(“它有子节点”);
}
其他的
{
Show(“它没有子节点”);
}

x=>x.NodeType!=Text
正在做什么?这是lambda运算符/表达式吗?是的,它是一个由lambda表达式表示的谓词委托,该表达式根据节点类型过滤ChildNodes集合:
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");
}