使用XmlReader获取节点的XPath

时间:2015-07-10 10:47:16

标签: c# xmlreader xmlnode

如何使用XMLReader获取当前节点的XPath?

E.g:

<Employee>
    <Entity>
        <Id>1</Id>
    </Entity>
</Employee>

所以我需要获得1的{​​{1}} XPath。有什么想法吗?

Employee/Entity/Id

1 个答案:

答案 0 :(得分:5)

我的第一个建议是使用更高级别的API,如LINQ to XML。使用像XmlReader这样的低级API的唯一原因是非常大的文件。使用LINQ to 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;
        }
    }
}

这是一个有效的演示:https://dotnetfiddle.net/dpOzuL

请注意,虽然这适用于您的简单示例,但这是一个非常天真的XPath表达式的创建,并不适用于所有情况(例如,当您有多个同名的兄弟姐妹时或涉及名称空间)。