dom4J:如何在Node上获取属性,元素和应用XPath?

时间:2011-10-13 04:20:47

标签: java xml xpath dom4j

我正在使用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
}

现在我想问下面三个问题:

  1. 我如何获得每个员工的ID属性?
  2. 我如何得到     每个员工的名称元素?
  3. 最后但最重要的一个,什么     XPath我需要指定以获取每个的Job节点     雇员?我尝试了以后但没有成功:(
  4. node.selectNodes( “/ EMP / Empployment_History /工作”); //返回零节点 (要么) node.selectNodes(“// Emp / Empployment_History / job”); //这会返回比预期更多的节点

1 个答案:

答案 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>元素中提取相关信息。