C# 使用XmlReader在不知道子节点名称的情况下获取子节点(在.net中)
如何使用.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
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));
}