检查XML Element是否有子元素或值

本文关键字:元素 XML Element 是否 检查 | 更新日期: 2023-09-27 18:15:27

我使用。net的XMLDocument作为XML文件的容器,当我使用:

document.GetElementsByTagName("ElementX")[0].HasChildNodes

对于所有元素返回true,即使元素看起来像这样:

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

<ElementX>Some Value</ElementX>

示例一显然有子元素,但第二个示例似乎还没有都返回true。我猜XMLDocument计数任何值(即使它不是一个元素)作为子?是否有一种方法,我可以检查如果一个元素只包含文本或元素(s)。

检查XML Element是否有子元素或值

您当前的代码:

document.GetElementsByTagName("ElementX")[0].HasChildNodes

返回根节点ElementX。GetElementsByTagName返回与该tagname匹配的元素的XmlNodeList。所以你只是得到根,它有子节点。

但这不会解决你的问题,如果我有你的问题是正确的,因为这些文本值1和2是节点根据这个库!喘息!它们是XmlText对象,而不是元素。

你正在寻找任何节点有一个XmlElement下面吗?如果是,您可能正在寻找这个:

child.ChildNodes.OfType<XmlElement>().Any()

运行这个插件看看我是什么意思:

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);
    }
}
相关文章: