C# 使用XmlReader获取节点的XPath
如何使用C# 使用XmlReader获取节点的XPath,c#,xmlreader,xmlnode,C#,Xmlreader,Xmlnode,如何使用XMLReader获取当前节点的XPath 例如: 1. 因此,我需要获取1的XPath,即Employee/Entity/Id。有什么想法吗 使用(var reader=XmlReader.Create(basePath,settings)) { while(reader.Read()) { if(reader.NodeType==XmlNodeType.Text) { //需要获取文本节点的xpath } else if(reader.Nod
XMLReader
获取当前节点的XPath
例如:
1.
因此,我需要获取1
的XPath,即Employee/Entity/Id
。有什么想法吗
使用(var reader=XmlReader.Create(basePath,settings))
{
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.Text)
{
//需要获取文本节点的xpath
}
else if(reader.NodeType==XmlNodeType.Element)
{
//需要获取当前节点的xpath
}
}
}
我的第一个建议是使用更高级别的API,如LINQ to XML。使用像XmlReader
这样的低级API的唯一原因是用于非常大的文件。使用LINQ到XML,一个简单的实现相当简单:
var doc = XDocument.Parse(xml);
foreach (var element in doc.Descendants())
{
var path = element.AncestorsAndSelf().Select(e => e.Name.LocalName).Reverse();
var xPath = string.Join("/", path);
}
使用XmlReader
有点复杂,因为您必须在运行时跟踪元素路径:
using (var reader = XmlReader.Create(basePath, settings))
{
var elements = new Stack<string>();
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if(!reader.IsEmptyElement)
elements.Push(reader.LocalName);
break;
case XmlNodeType.EndElement:
elements.Pop();
break;
case XmlNodeType.Text:
path = string.Join("/", elements.Reverse());
break;
}
}
}
使用(var reader=XmlReader.Create(basePath,settings))
{
var元素=新堆栈();
while(reader.Read())
{
开关(reader.NodeType)
{
case XmlNodeType.Element:
如果(!reader.IsEmptyElement)
elements.Push(reader.LocalName);
打破
案例XmlNodeType.EndElement:
元素Pop();
打破
案例XmlNodeType.Text:
path=string.Join(“/”,elements.Reverse());
打破
}
}
}
这是一个有效的演示:
请注意,虽然这适用于您的普通示例,但这是一个非常简单的
XPath
表达式创建,并且不会在所有情况下都有效(例如,当您有多个同名同级或涉及名称空间时).您必须跟踪您所在的元素-您可以使用堆栈,在读取每个元素时将其推入,并在到达EndElement时将其弹出。不过,你想做什么?是否需要下拉到XmlReader
?使用像XDocument
@CharlesMager这样的DOM会更容易,你能提供一些例子吗?XmlReader不能使用XPath。@AlexanderPetrov我需要迭代Xml
中的所有节点,并且需要获得每个节点的XPath
?是否可以使用XDocument
?如果是这样的话,你能举一些例子吗?多谢你的时间,可以使用xdocument迭代xml中的所有元素,然后使用xpath吗?您发布的代码将仅对中的架构起作用question@SSS我已更新以迭代所有元素。不清楚你用这个干什么。如果您想要一个在所有情况下都能获得有效XPath的不那么幼稚的实现,那么请查看。