本帖最后由 大山哥哥 于 2017-5-31 18:52 编辑
当在XML文件中引入了外部约束,使用了命名空间的时候,如果要使用DOM4J+XPATH解析XML文件可能会出现解析不到节点内容的问题,下面给出一种解决办法。
【步骤一】准备XML文件和约束文件
XML文件(aaa.xml,该文件放置在src目录下):
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8"?>
<classes
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="xiaofan"
xsi:schemaLocation="xiaofan members.xsd"
>
<member no="1">
<name>名称1</name>
<birthday>1992-11-09</birthday>
<hobby>女</hobby>
</member>
<member no="2">
<name>名称2</name>
<birthday>1999-03-03</birthday>
<hobby>男</hobby>
</member>
</classes>
约束文件(members.xsd):
[XML] 纯文本查看 复制代码 <?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="xiaofan"
elementFormDefault="qualified">
<element name="classes">
<complexType>
<sequence minOccurs="1" maxOccurs="unbounded">
<element name="member">
<complexType>
<all>
<element name="name" type="string"></element>
<element name="birthday" type="date"></element>
<element name="hobby" type="string"></element>
</all>
<attribute name="no" type="int"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
在aaa.xml文件中,自定义的命名空间是“xiaofan”
【步骤二】使用DMO4J+XPATH完成解析
[Java] 纯文本查看 复制代码 @Test
public void oldCalXml(){
try {
//使用DOM4J SAXReader进行解析
SAXReader saxReader = new SAXReader();
//拿到document对象
Document document = saxReader.read("src/aaa.xml");
//准备一个map集合,用于存放给xpath使用的命名空间键值对
Map<String, String> map = new HashMap<String, String>();
//将XML文件中我们自定义的命名空间xiaofan交给一个key
map.put("nsKey", "xiaofan");//第一个参数 命名空间的名字 第二个参数 是我们自定义的namespace
//使用DocumentFactory装载刚刚设置的map配置
saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
//下面,就可以使用XML对想要读取内容的节点进行解析了
List<Element> nodes = document.selectNodes("//nsKey:name");
for (Element element : nodes) {
System.out.println(element.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
【打印如下】
|