使用XmlReader获取子节点而不知道其名称(在.net中)

时间:2015-10-17 04:26:55

标签: c# .net xml xmlreader

如何在.net中使用XmlReader获取根节点的顶级子节点(unknownA)?由于他们的姓名未知ReadToDescendant(string)ReadToNextSibling(string)无法正常工作。

<root>
    <unknownA/>
    <unknownA/>
    <unknownA>
        <unknownB/>
        <unknownB/>
    </unknownA>
    <unknownA/>
    <unknownA>
        <unknownB/>
        <unknownB>
            <unknownC/>
            <unknownC/>
        </unknownB>
    </unknownA>
    <unknownA/>
</root>

1 个答案:

答案 0 :(得分:1)

您可以使用XmlReader.Read()遍历文件,检查当前Depth与初始深度,直到达到初始深度的元素结尾,使用以下扩展方法:

public static class XmlReaderExtensions
{
    public static IEnumerable<string> ReadChildElementNames(this XmlReader xmlReader)
    {
        if (xmlReader == null)
            throw new ArgumentNullException();
        if (xmlReader.NodeType == XmlNodeType.Element && !xmlReader.IsEmptyElement)
        {
            var depth = xmlReader.Depth;
            while (xmlReader.Read())
            {
                if (xmlReader.Depth == depth + 1 && xmlReader.NodeType == XmlNodeType.Element)
                    yield return xmlReader.Name;
                else if (xmlReader.Depth == depth && xmlReader.NodeType == XmlNodeType.EndElement)
                    break;
            }
        }
    }

    public static bool ReadToFirstElement(this XmlReader xmlReader)
    {
        if (xmlReader == null)
            throw new ArgumentNullException();
        while (xmlReader.NodeType != XmlNodeType.Element)
            if (!xmlReader.Read())
                return false;
        return true;
    }
}

然后可以按如下方式使用:

        var xml = GetXml(); // Your XML string

        using (var textReader = new StringReader(xml))
        using (var xmlReader = XmlReader.Create(textReader))
        {
            xmlReader.ReadToFirstElement();
            var names = xmlReader.ReadChildElementNames().ToArray();
            Console.WriteLine(string.Join("\n", names));
        }