【问题标题】:Check whether an XML Element has child elements or a value检查 XML 元素是否有子元素或值
【发布时间】:2016-10-28 11:28:48
【问题描述】:

我使用 .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 计算任何值(即使它不是元素)作为孩子?有没有办法可以检查一个元素是否只包含文本或一个元素。提前致谢。

【问题讨论】:

  • 您检查了((XmlElement)(document.GetElementsByTagName("ElementX")[0])).ChildNodes 中的内容吗?
  • 看看this答案
  • @Itiveron 我做了更多的调试,似乎将值放在自己的节点中,所以我必须更深入一层来检查它是否有子节点。知道为什么要这样做吗?

标签: c# xml


【解决方案1】:

您当前的代码:

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

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 2020-02-21
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多