C# 检查XML元素是否具有子元素或值

C# 检查XML元素是否具有子元素或值,c#,xml,C#,Xml,我使用.NET的XMLDocument作为XML文件的容器,当我使用: document.GetElementsByTagName("ElementX")[0].HasChildNodes 即使元素看起来是这样,它也会为所有元素返回true: <ElementX> <A>1</A> <B>2</B> Some value </ElementX> 1. 2. 一些价值 或 一些值 示例一显然有

我使用.NET的XMLDocument作为XML文件的容器,当我使用:

document.GetElementsByTagName("ElementX")[0].HasChildNodes
即使元素看起来是这样,它也会为所有元素返回true:

<ElementX>
    <A>1</A>
    <B>2</B>
    Some value
</ElementX>

1.
2.
一些价值

一些值
示例一显然有子元素,但第二个示例似乎还没有返回true。我猜XMLDocument会将任何值(即使它不是一个元素)计为一个子元素吗?是否有一种方法可以检查元素是否只包含文本或元素。提前感谢。

您当前的代码:

document.GetElementsByTagName("ElementX")[0].HasChildNodes
正在返回根节点ElementX。GetElementsByTagName返回与该标记名匹配的元素的XmlNodeList。所以你只需要得到根,它有子节点

但如果我没弄错的话,这并不能解决你的问题,因为根据这个库,那些文本值1和2是节点!喘息但它们是XmlText对象,而不是元素

您是否在寻找任何在其下面有XmlElement的节点?如果是这样,您可能正在寻找:

child.ChildNodes.OfType<XmlElement>().Any()
child.ChildNodes.OfType().Any()
运行此humdinger以了解我的意思:

internal static class Program
{
    private static void Main()
    {
        var doc = new XmlDocument();
        doc.LoadXml("<ElementX><A>1</A><B>2</B>Some value</ElementX>");
        Console.WriteLine("{0,15}{1,15}{2,15}{3,15}","Name","Children","ChildElements","Value");
        foreach (XmlElement e in doc.GetElementsByTagName("ElementX"))
            ChildNodeCheck(e);
    }

    private static void ChildNodeCheck(XmlNode element)
    {
        Console.WriteLine("{0,15}{1,15}{2,15}{3,15}", 
            element.Name, 
            element.HasChildNodes, 
            element.ChildNodes.OfType<XmlElement>().Any(), 
            element.Value);

        if (!element.HasChildNodes) return;
        foreach(XmlNode child in element.ChildNodes)
            ChildNodeCheck(child);
    }
}
内部静态类程序
{
私有静态void Main()
{
var doc=新的XmlDocument();
doc.LoadXml(“12Some value”);
WriteLine(“{0,15}{1,15}{2,15}{3,15}”,“Name”,“Children”,“ChildElements”,“Value”);
foreach(doc.GetElementsByTagName(“ElementX”)中的XmlElement e)
ChildNodeCheck(e);
}
私有静态void ChildNodeCheck(XmlNode元素)
{
Console.WriteLine(“{0,15}{1,15}{2,15}{3,15}”,
元素名称,
element.HasChildNodes,
元素.ChildNodes.OfType().Any(),
要素(价值);
如果(!element.HasChildNodes)返回;
foreach(元素.ChildNodes中的XmlNode子节点)
ChildNodeCheck(child);
}
}

是否检查了
((xmlement)(document.GetElementsByTagName(“ElementX”)[0])中的内容。ChildNodes
?查看answer@Itiveron我做了更多的调试,似乎它将值放在了自己的节点中,所以我必须深入一层来检查它是否有子节点。知道为什么要这么做吗?
internal static class Program
{
    private static void Main()
    {
        var doc = new XmlDocument();
        doc.LoadXml("<ElementX><A>1</A><B>2</B>Some value</ElementX>");
        Console.WriteLine("{0,15}{1,15}{2,15}{3,15}","Name","Children","ChildElements","Value");
        foreach (XmlElement e in doc.GetElementsByTagName("ElementX"))
            ChildNodeCheck(e);
    }

    private static void ChildNodeCheck(XmlNode element)
    {
        Console.WriteLine("{0,15}{1,15}{2,15}{3,15}", 
            element.Name, 
            element.HasChildNodes, 
            element.ChildNodes.OfType<XmlElement>().Any(), 
            element.Value);

        if (!element.HasChildNodes) return;
        foreach(XmlNode child in element.ChildNodes)
            ChildNodeCheck(child);
    }
}