我正在使用dom4j读取XML,使用XPath技术来选择所需的节点。考虑一下我的XML看起来像这样:
<Emp_Dir>
<Emp_Classification type ="Permanent" >
<Emp id= "1">
<name>jame</name>
<Emp_Bio>
<age>12</age>
<height>5.4</height>
<weight>78</weight>
</Emp_Bio>
<Empployment_History>
<job>
<salary>2000</salary>
<designation>senior developer</designation>
<duration>2years</duration>
</job>
<job>
<salary>1000</salary>
<designation>developer</designation>
<duration>3years</duration>
</job>
</Empployment_History>
</Emp>
.
.
.
</Emp_Classification>
<Emp_Classification type ="Contract" >
.
.
.
</Emp_Classification>
<Emp_Classification type ="PartTime" >
.
.
.
</Emp_Classification>
</Emp_Dir>
注意:上面的XML可能看起来很丑,但我只是为了理解和保持项目的安全性而创建这个虚拟文件
我希望的目标是获得每个永久员工的就业历史,为此我通过使用以下XPath Epression设法获得永久员工的所有“Emp”节点:
//Emp_Dir/Emp_Classification[@type='Permanent']/Emp
获取和存储节点的代码如下所示:
List<? extends Node> lstprmntEmps = document.selectNodes("//Emp_Dir/Emp_Classification/[@type='Permanent']/Emp");
ArrayList<Employee> Employees = new ArrayList<Employee>();//Employee is my custom class
for (Node node : lstprmntEmps)
{
Employees.add(ParseEmployee(node));//ParseEmployee(. . .) is my custom function that pareses emp XML and return Employee object
}
现在我想问下面三个问题:
node.selectNodes( “/ EMP / Empployment_History /工作”); //返回零节点 (要么) node.selectNodes(“// Emp / Empployment_History / job”); //这会返回比预期更多的节点
答案 0 :(得分:1)
如果我理解正确,当你说“每个员工的工作节点”时,你不正在寻找一个返回XML文件中所有工作节点的XPath - 而是您正在寻求实现ParseEmployee
方法,并从文档中提取一个给定员工的工作列表(由传入的XML节点标识)?
它可以像这样实现(省略你实际用提取的字符串做一些有用的部分,省略空检查,你想要包括!)
public parseEmployee (Element e) {
String id = e.attributeValue("id");
String name = e.elements("name").get(0).getText();
List<Element> jobs = e.elements("job");
for (Element job : jobs) {
parseJob(job);
}
}
parseJob()
将遵循类似的原则,并从传递给它的<job>
元素中提取相关信息。