使用XmlReader在不知道子节点名称的情况下获取子节点(在.net中)

本文关键字:子节点 获取 net 情况下 XmlReader 不知道 使用 | 更新日期: 2023-09-27 18:18:01

如何获得。net中XmlReader根节点的顶级子节点(unknownA) ?因为它们的名字是未知ReadToDescendant(string)ReadToNextSibling(string)不能工作

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

使用XmlReader在不知道子节点名称的情况下获取子节点(在.net中)

您可以使用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));
        }