如何从xml文件获取值和路径?

时间:2019-01-25 18:26:48

标签: java xml spring-boot xpath xmldog

我正在使用XMLDog从xml文件读取值。问题是我一直在获取空值。

这是xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<persons>
  <person>
    <name>John Doe</name>
    <age>30</age>
  </person>
  <person>
    <name>Jane Doe</name>
    <age>30</age>
  </person>
</persons>

我正在使用的代码:

final DefaultNamespaceContext nsContext = new DefaultNamespaceContext();
final XMLDog dog = new XMLDog(nsContext);

final Expression expression = dog.addXPath("/persons/person/name");
final XPathResults result = dog.sniff(new InputSource("/mnt/data-disk/persons.xml"));

final List<NodeItem> list = (List<NodeItem>)result.getResult(expression);
list.forEach(item -> System.out.println("Path: " + item.location + ", value: " + item.value));

这就是我得到的:

Path: /persons[1]/person[1]/name[1], value: null
Path: /persons[1]/person[2]/name[1], value: null

我需要帮助弄清楚为什么我能获得null的价值。

在我的项目中,我需要确切的路径和值。 还有其他方法可以实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

缺少XPath:/text()。 我将其更改为:/persons/person/name/text()。 现在输出正常:

Path: /persons[1]/person[1]/name[1]/text()[1], value: John Doe
Path: /persons[1]/person[2]/name[1]/text()[1], value: Jane Doe

答案 1 :(得分:0)

从文档中:

  

DOM结果

     

默认情况下,XMLDog不会为结果构造dom节点。您可以   配置DOM结果如下:

import package jlibs.xml.sax.dog.sniff.Event;

Event event = dog.createEvent();
results = new XPathResults(event);
event.setListener(results);
event.setXMLBuilder(new DOMBuilder());
dog.sniff(event, new InputSource("note.xml"));

List<NodeItem> items = (List<NodeItem>)results.getResult(xpath1)

是否有可能试图在不创建DOM的情况下遍历DOM?