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

时间:2016-10-28 11:28:49

标签: c# xml

我使用.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 个答案:

答案 0 :(得分:6)

您当前的代码:

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

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

但是,如果我的问题是正确的,那将无法解决您的问题,因为那些文本值1和2是根据此库的节点!喘气!它们虽然是XmlText对象,但不是元素。

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

child.ChildNodes.OfType<XmlElement>().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);
    }
}