最近做xml解析比较多,由于之前接触文本数据源比较少,在解析过程中碰到了很多问题,这里记录下,供今后查询。也为碰到同样问题的同学提供一种解决问题的方向。
直接上干货~~~
原因分析
首先,再次确认下Node节点是否存在以及Xpath路径没有写错~~,可以另外找一个测试用的xml验证下。这个原因就不再多赘述了,这里想记录的是由于namespace没有设置正确导致取不到节点数据的解决办法。当然了,仅供参考咯。
解决办法
这里是自动添加namespace的方式,不多说,直接上代码~~~
Maven依赖:
<!-- dependency for parsing xml -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
伪代码:
public static void main(String[] args) throws Exception{
Map map = new HashMap();
SAXReader saxReader = new SAXReader();
Document doc = reader.read(new File(xmlPath));
Element root = doc.getRootElement();
List content = root.content();
for (Object o : content) {
if (o.getClass().getName().equalsIgnoreCase(org.dom4j.Namespace.class.getName())) {
Namespace e = (Namespace) o;
String namespacePrefix = StringUtils.isEmpty(e.getPrefix()) ? "src" : e.getPrefix()
String namespaceURI = e.getURI();
System.out.println(namespacePrefix + ":" + namespaceURI);
map.put(namespacePrefix, namespaceURI);
}
}
reader.getDocumentFactory().setXPathNamespaceURIs(map);
// 查询方式:
List tmp = document.selectNodes("/src:report/src:list-property");
System.out.println(tmp.size());
}
主要添加完namespace后,相应的Xpath查询路径也要加上相应的namespace路径,切记了~~~