java - 在具有相对路径的 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 太复杂,写完整路径是不可行的。非常感谢任何帮助。
解决方案
您将希望在作为名称和 id 的共享祖先的最低节点上设置谓词,并从那里访问目标数据:
/Employees/Employee[./GenericData/Data/Name/text() = "ABC"]/DepartmentData/SubDepartment/DeptID/text()
这会查找员工,只保留具有相关名称的那些(那个),然后提取他们的(它的)DeptID。
这不需要完整路径,例如,您可以//Employee
根据需要使用。也就是说,使用//
会对性能产生重大影响,并且很少需要使用。
推荐阅读
- javascript - 服务工作者在本地服务时注册,但不能在线工作
- python - 性能问题:根据未来值标记 Pandas 系列中的项目
- python - Kivy:MDIconButton 不在 Gridlayout 中居中,并且带有按钮行为的 MDLabel 无法移动
- c++ - 当我尝试在 C++ 中编译和运行我的“main.cpp”文件时,导致调用中止方法的原因是什么?
- php - 在php中删除开始日期和结束日期之间的日期数组
- c++ - 如何在 C++ 中接受用户输入作为向量的长度
- java - ObjectMapper 的 readValue 方法给出 MismatchedInputException
- sql-server - 如何将 2 个视图和一个表合并为 1 个视图?
- ruby-on-rails - ActiveRecord::StatementInvalid: PG::UndefinedTable: 错误: 关系“人”不存在
- javascript - 按钮在连续点击事件上将重复数据附加到 div