【黑马程序员】使用DOM4J+XPATH 解析带有schema
约束的XML 文件
当在XML 文件中引入了外部约束,使用了命名空间的时候,如果要使用DOM4J+XPATH 解析XML 文件 可能会出现解析不到节点内容的问题,下面给出一种解决办法。
【步骤一】准备XML 文件和约束文件
XML 文件(aaa.xml ,该文件放置在src 目录下):
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 <?xml version ="1.0" encoding ="UTF-8"?>
<classes
xmlns:xsi ="/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 ):
01 02 03 04 05 06 07 08 09 10 11 <?xml version ="1.0" encoding ="UTF-8"?>
<schema
xmlns ="/2001/XMLSchema"
targetNamespace ="xiaofan"
elementFormDefault ="qualified">
<element name ="classes">
<complexType >
<sequence minOccurs ="1" maxOccurs ="unbounded">
<element name ="member">
<complexType >
12 13 14 15 16 17 18 19 20 21 22 23 24 <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 完成解析
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 @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) {
22
23
e.printStackTrace();
}
}
【打印如下】。