【问题标题】:using "ancestor" in xpath with relative path在具有相对路径的 xpath 中使用“祖先”
【发布时间】:2020-02-04 13:27:06
【问题描述】:

我有一个类似于

的xml
<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太复杂,写完整路径是不可行的。非常感谢任何帮助。

【问题讨论】:

    标签: java xml xpath relative-path ancestor


    【解决方案1】:

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

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

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

    这不需要完整路径,例如如果你愿意,你可以使用//Employee。也就是说,使用// 会对性能产生重大影响,而且很少需要使用。

    【讨论】:

      【解决方案2】:

      如果DeptNameEmployee 是唯一的,您可以只使用//

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

      或者与@Aaron 的方法相同,我认为它更直观。此外,如果您可以使用 XPath 2.0,您可以将 Employee 或其他人员存储在一个变量中以获得更好的可读性,正如您所说,您的 XML 非常复杂:

      let $Employee := /Employees/Employee[GenericData/Data/Name/text() = "ABC"]
      return
      $Employee//DeptName/text()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2020-01-09
        相关资源
        最近更新 更多