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的不那么幼稚的实现,那么请查看。