c# - 如何通过在XmlDocument或XDocument中传递xElement名称来获取绝对xpath?

标签 c# .net xml xpath linq-to-xml

我有一个像这样的 xml 文件节点结构

<Employee>
    <EmpId></EmpId>
    <EmpName></EmpName>
    <Salary>
        <Basic></Basic>
        <HRA></HRA>
    </Salary>
    <Qualifications>
        <Course>
            <Name></Name>
            <Year></year>
        </course>
        <Course>
            <Name></Name>
            <Year></year>
        </course>
        <Course>
            <Name></Name>
            <Year></year>
        </course>
    </Qualifications>
<Employee>

从这个文件中,我想使用 XmlDocument 或 XDocument 获取任何给定元素名称(不是 XElement)的绝对 xpath。 怎么做?

最佳答案

对于没有命名空间的简单 XML,请尝试以下操作:

public static string GetPath(XElement element)
{
    return string.Join("/", element.AncestorsAndSelf().Reverse()
        .Select(e =>
            {
                var index = GetIndex(e);

                if (index == 1)
                {
                    return e.Name.LocalName;
                }

                return string.Format("{0}[{1}]", e.Name.LocalName, GetIndex(e));
            }));

}

private static int GetIndex(XElement element)
{
    var i = 1;

    if (element.Parent == null)
    {
        return 1;
    }

    foreach (var e in element.Parent.Elements(element.Name.LocalName))
    {
        if (e == element)
        {
            break;
        }

        i++;
    }

    return i;
}

关于c# - 如何通过在XmlDocument或XDocument中传递xElement名称来获取绝对xpath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9162251/

相关文章:

c# - 2 在 C# 中的连续游戏

android - 在 ListView 中设置背景颜色

regex - XML 模式中正则表达式的正确语法

c# - 有什么叫做列表数组的东西吗?

c# - 如何使用 C# 唯一标识计算机?

c# - 是否可以将 ASP.NET 成员资格与在 ASP.NET Identity 2.0 中创建的表一起使用以进行身份​​验证?

c# - 高斯平滑公式应用

android - XML 中 setTag(key, value) 的等价性

c# - `as` 会启用多态性吗?将继承的类传递给采用基类启用多态性的方法?

c# - 合并多个列表,每个列表的可变长度为 "popping"个元素