使用xpath和DOM解析器读取xml

时间:2018-03-22 16:24:11

标签: java xml dom xpath

我有以下示例xml

<employee>
  <description>Age:26</description>
  <description>Height:6.0</description>
  <description>Weight:180</description>
  <description>HairColor:Black</description>
</employee>
<employee>
  <description>Degree:BS</description>
  <description>Experience:4 years</description>
  <description>HairColor:Black</description>
</employee>

我无法控制xml,并且这些元素是可选的,并且由不同代理商报告并合并到一个xml中。我需要解析它,我正在使用XPath和DOM解析器。我可以通过以下代码打印Description标签,其中nList是Employee节点列表

private static void getChargeDescription(NodeList nList) {
  for (int i = 0; i < nList.getLength(); i++) {

    //get employee node
    Node nNode = nList.item(i);
    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
      Element eElement = (Element) nNode;
      NodeList descriptionNodes = eElement.getElementsByTagName("description");
      for(int j = 0; j < descriptionNodes.getLength(); j++) {
        System.out.println(descriptionNodes.item(j).getTextContent());
      }
    }
  }
}

我的问题是如何设置以下类的属性。

public class Employee {
  private List<String> Height;
  private List<String> Weight;
  private List<String> Experience;
  private List<String> HairColor;
  private List<String> Age;
  private List<String> Degree;
  //getters and setters 
}

因为元素描述的名称将相同,并且每个代理商可以报告不同数量的描述,并且多个Employee元素之间可以有相同的描述。因此,我能想到的唯一方法是获取文本内容并确定它是什么类型的信息。还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

从您的Employee对象看来,您知道属性名称(年龄,学位等)。您可以使用XPath迭代这些名称并获取包含该属性的所有元素,然后构建您的列表

使用xmllint命令行实用程序

的XPath示例

xmllint --xpath '//description[starts-with(text(),"Age")]' test.xml

<description>Age:26</description>

NodeList descriptionNodes将仅包含上述示例中的请求属性Age。你可以有2个for循环,属性名称的外部和当前NodeList的内部。