如何在C#中检查CML子节点

时间:2013-01-18 04:49:10

标签: c# xml visual-studio-2010 xmlreader

我正在使用xmlreader来读取XML文件。我想确定一个元素是否有子节点。

目前,我使用IsEmptyElement方法查找是否存在子元素。我发现,即使标签包含文本数据而不是元素,它也会返回true。

if (!file.IsEmptyElement) {
    elem.subElems.Add(readXml(file));
}

我是如何使用xml阅读器修复此问题的?任何帮助将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果您只是需要检查,请使用XmlDocument代替...我发现它更易于理解和编码。

XmlDocument doc = new XmlDocument();
doc.LoadXml("YourDocument");

XmlNode root = doc.FirstChild;

if (root.HasChildNodes)
{
    // Do something...
}

阅读器:

using (XmlReader reader = ...)
{
    while (reader.Read())
    {
        if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == ...))
        {
            Int32 childrenCount = CountChildred(reader, XmlNodeType.Element);
            // Your code...

public static Int32 CountChildred(XmlReader node, XmlNodeType type)
{
    Int32 count = 0;
    Int32 currentDepth = node.Depth;
    Int32 validDepth = currentDepth + 1;

    while (node.Read() && (node.Depth != currentDepth))
    {
        if ((node.NodeType == type) && (node.Depth == validDepth))
            ++count;
    }

    return count;
}

答案 1 :(得分:1)

IsEmptyElement的行为是预料之中的,而且读者确实是读者位于元素开头的唯一信息。此时读者还没有尝试读取元素的内部XML,因此如果存在任何子节点,文本节点或两者的混合,则没有信息。

要解决此问题,您需要阅读每个子元素并将它们单独添加到您的列表中(或者您拥有的任何内容)。