Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlReader在不知道子节点名称的情况下获取子节点(在.net中)_C#_.net_Xml_Xmlreader - Fatal编程技术网

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

C# 使用XmlReader在不知道子节点名称的情况下获取子节点(在.net中),c#,.net,xml,xmlreader,C#,.net,Xml,Xmlreader,如何使用.net中的XmlReader获取根节点的顶级子节点(未知节点)?因为它们的名称是未知的,ReadToDescendant(string)和ReadToNextSibling(string)不起作用 <root> <unknownA/> <unknownA/> <unknownA> <unknownB/> <unknownB/> </unknown

如何使用.net中的
XmlReader
获取根节点的顶级子节点(未知节点)?因为它们的名称是未知的,
ReadToDescendant(string)
ReadToNextSibling(string)
不起作用

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

您可以使用以下扩展方法遍历文件,根据初始深度检查当前值,直到到达初始深度处的元素末端:

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

你说“获取节点”是什么意思?你只是想得到元素名,或者每个节点的所有内容,或者什么?另外,您是否考虑过使用类似的东西而不是直接使用XmlReader?使用它要容易得多。@BrianRogers我正在进行嵌套反序列化。是的,我考虑过
XmlDocument
。但是
XmlReader
效率更高,对吗?您在寻找吗?取决于您的XML有多大?如果它很小,那就没关系了。如果它很大,您仍然可以结合XmlReader使用
XElement
,以非常小的内存占用在XML中传输。有关该方法,请参见备注和示例代码。@dbc谢谢!我最后使用了
Skip()
        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));
        }