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

4

我将使用.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将任何值(即使它不是元素)都视为子元素?是否有一种方法可以检查元素是否只包含文本或元素。提前致谢。


1
你检查了((XmlElement)(document.GetElementsByTagName("ElementX")[0])).ChildNodes里面有什么吗? - ltiveron
请查看这个答案。 - croxy
@Itiveron 我进行了更多的调试,似乎它将值放置在它们自己的节点中,所以我必须进一步检查是否有子节点。你知道为什么会这样吗? - anon
1个回答

8

您当前的代码:

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

返回的是根节点ElementX。GetElementsByTagName返回一个匹配该标签名称的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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接