首页 > 解决方案 > 在具有相对路径的 xpath 中使用“祖先”

问题描述

我有一个类似于

<Employees>
    <Employee>
        <GenericData>
            <Data>
                <ID>1</ID>
                <Name>ABC</Name>
            </Data>
        </GenericData>
        <DepartmentData>
            <SubDepartment>
                <DeptID>12</DeptID>
                <DeptName>IT</DeptName>
            </SubDepartment>
        </DepartmentData>
    </Employee>
    <Employee>
        <GenericData>
            <Data>
                <ID>1</ID>
                <Name>XYZ</Name>
            </Data>
        </GenericData>
        <DepartmentData>
            <SubDepartment>
                <DeptID>13</DeptID>
                <DeptName>HR</DeptName>
            </SubDepartment>
        </DepartmentData>
    </Employee>
</Employees>

我的问题是根据名称获取 DeptID。我可以使用以下方法获取相同的内容:

//Data/Name[text()="ABC"]/ancestor::Employee/DepartmentData/SubDepartment/DeptName/text()

需要一个解决方案来在祖先之后使用相对路径,例如:

//Data/Name[text()=\"ABC\"]/ancestor::Employee/*/DeptName/text()

使用 * 即使用相对路径删除 DepartmentData/SubDepartment。

注意:我的实际 xml 太复杂,写完整路径是不可行的。非常感谢任何帮助。

标签: javaxmlxpathrelative-pathancestor

解决方案


您将希望在作为名称和 id 的共享祖先的最低节点上设置谓词,并从那里访问目标数据:

/Employees/Employee[./GenericData/Data/Name/text() = "ABC"]/DepartmentData/SubDepartment/DeptID/text()

这会查找员工,只保留具有相关名称的那些(那个),然后提取他们的(它的)DeptID。

这不需要完整路径,例如,您可以//Employee根据需要使用。也就是说,使用//会对性能产生重大影响,并且很少需要使用。


推荐阅读