XML文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.guotest01.in/01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.guotest01.in/01 test05.xsd">
<书 出版社="出版社01">
<书名>书名01</书名>
<作者>作者1</作者>
<售价>1</售价>
<简介>简介1</简介>
</书>
<书 出版社="出版社02">
<书名>书名02</书名>
<作者>作者2</作者>
<售价>2</售价>
<简介>简介2</简介>
</书>
<书 出版社="出版社03">
<书名>书名03</书名>
<作者>作者3</作者>
<售价>3</售价>
<简介>简介3</简介>
</书>
<书 出版社="出版社04">
<书名>书名04</书名>
<作者>作者4</作者>
<售价>4</售价>
<简介>简介4</简介>
</书>
</书架>
需求:取得第二本书节点下的作者节点的文本内容即:/书架/书[2]/作者,我用的JDK1.8
用如下的java代码无法解析带有命名空间的XML,原因就不多说了,百度上有很多,我这里就只说我的一种解决办法。
String path = "WebContent/testXml/book2.xml";
SAXReader reader = new SAXReader();
Document document=reader.read(path);
Node author = document.selectSingleNode("/书架/书[2]/作者");
System.out.println(author.getText());
我的解决办法就是设置命名空间并且XPath语句查询的时候节点前面带上命名空间的名称。
Map map = new HashMap();
map.put("xmlns","http://www.guotest01.in/01");
SAXReader saxReader = new SAXReader();
File file = new File("WebContent/testXml/test4.xml");
saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
Document document = saxReader.read(file);
List<Element> tmp = document.selectNodes("/xmlns:书架/xmlns:书[1]/xmlns:作者");
System.out.println(tmp.size());
System.out.println(tmp.get(0).getText());