且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-11-25 23:53:22

您当前的代码:

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

正在返回该根节点 ElementX.GetElementsByTagName 返回与该标记名匹配的元素的 XmlNodeList.所以你只是得到根,它有子节点.

is returning that root node ElementX. GetElementsByTagName returns an XmlNodeList of elements matching that tagname. So you're just getting the root, which has child nodes.

但是,如果我的问题是正确的,那并不能解决您的问题,因为根据此库,这些文本值 1 和 2 是节点!喘气!不过,它们是 XmlText 对象,而不是元素.

But that won't solve your problem, if I have your question right, because those text values 1 and 2 are nodes according to this library! Gasp! They're XmlText objects though, not elements.

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

Are you looking for any node that has an XmlElement underneath it? If so, you are probably looking for this:

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

运行这个 humdinger 看看我的意思:

Run this humdinger to see what I mean:

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);
    }
}