Dom4J配合XPath解析schema约束的xml配置文件问题
如果一个xml文件没有引入约束,或者引入的是DTD约束时,那么使用dom4j和xpath是可以正常解析的,不引入约束的情况本文不再展示。
引入DTD约束的情况
- mybook.dtd:
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT books (book+)>
<!ELEMENT book (name|author|price)+>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book id ID #REQUIRED publish CDATA #IMPLIED>
- book.xml:
<?xml version="1.0" encoding="UTF-8 ?>
<!DOCTYPE books SYSTEM "mybook.dtd">
<books>
<book id="_001">
<name>西游记</name>
</book>
<book id="_002">
<name>三国演义</name>
</book>
<book id="_003">
<name>水浒传</name>
</book>
<book id="_004">
<name>红楼梦</name>
</book>
</books>
测试类:
public class DemoBook {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(DemoBook.class.getResourceAsStream("book.xml"));
List<Node> nodes = document.selectNodes("//name");
for (Node node : nodes) {
Element element = (Element) node;
System.out.print(element.getText()+" ");
}
}
}
//输出结果:西游记 三国演义 水浒传 红楼梦
可见,引入了DTD约束的xml是可以通过dom4j和xpath表达式正常解析的.而引入Schema约束的时候呢?
引入Schema约束的情况
- mybook.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.mytest.com/book"
elementFormDefault="qualified">
<element name="books">
<complexType>
<sequence maxOccurs="unbounded">
<element name="book">
<complexType>
<choice maxOccurs="unbounded">
<element name="name" type="string"></element>
<element name="author" type="string"></element>
</choice>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
- book.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<books
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.mytest.com/book"
xsi:schemaLocation="http://www.mytest.com/book /mybook.xsd"
>
<book>
<name>西游记</name>
</book>
<book>
<name>三国演义</name>
</book>
<book>
<name>水浒传</name>
</book>
<book>
<name>红楼梦</name>
</book>
</books>
测试类:
public class DemoBook {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(DemoBook.class.getResourceAsStream("book.xml"));
List<Node> nodes = document.selectNodes("//name");
for (Node node : nodes) {
Element element = (Element) node;
System.out.println(element.getText());
}
}
}
结果为:

我们会发现,同样的代码,运行在引入了Schema约束的xml文件上虽然正常运行了,但是并没有达到我们想要的结果,document对象获取到的nodes集合是个空集合[] 。
产生问题的原因
当XPath表达式中没有前缀时,查询的元素命名空间也应该是默认值,否则是查询不到结果的。引入了Schema约束的xml文件使用了命名空间,此时查询元素的命名空间不再是默认值了,所以此时的结果是个空集合。
解决方案:
此时如果想要正确的解析结果,必须设置命名空间后再对文档进行解析。
修改后的测试类:
public class DemoBook {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
//声明一个map集合保存命名空间
Map<String,String > map = new HashMap<>();
//给命名空间取别名
map.put("myNameSpace","http://www.mytest.com/book");
//设置命名空间
reader.getDocumentFactory().setXPathNamespaceURIs(map);
//读取文档
Document document = reader.read(Demo1.class.getResourceAsStream("book.xml"));
List<Node> nodes = document.selectNodes("//myNameSpace:name");
for (Node node : nodes) {
Element element = (Element)node;
System.out.println(element.getText());
}
}
}
运行结果:

Perfect~
Dom4J配合XPath解析schema约束的xml配置文件问题的更多相关文章
- 简单用DOM4J结合XPATH解析XML
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接获取到某个元素 使用dom4j支持xpath的操作的几种主要形式 第一种形式 ...
- java使用dom4j和XPath解析XML与.net 操作XML小结
最近研究java的dom4j包,使用 dom4j包来操作了xml 文件 包括三个文件:studentInfo.xml(待解析的xml文件), Dom4jReadExmple.java(解析的主要类), ...
- 使用Dom4j的xPath解析xml文件------xpath语法
官方语法地址:http//www.w3school.com.cn/xpath/index.asp xpath使用路径表达式来选取xml文档中的节点或节点集.节点是通过沿着路径(path)或者步(ste ...
- 利用XPath解析带有xmlns的XML文件
在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中 ...
- JAVA通过XPath解析XML性能比较(原创)
(转载请标明原文地址) 最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种 ...
- dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程
*1 dom4j解析器 1)CRUD的含义:CreateReadUpdateDelete增删查改 2)XML解析器有二类,分别是DOM和SAX(simple Api for xml). ...
- JAVA通过XPath解析XML性能比较
转自[http://www.cnblogs.com/mouse-coder/p/3451243.html] 最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 ...
- Schema约束
Schema约束(*xml中如何引入schema约束)(看懂Schema:能根据Schema写出XML文档来:)1.Schema约束文档本身就是一个XML文档.2.Schema对名称空间支持很好3.S ...
- XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...
随机推荐
- java获取一个月的天数
import java.text.SimpleDateFormat; import java.util.Calendar; public class Test { public static void ...
- 使用Ratpack与Spring Boot构建高性能JVM微服务
在微服务天堂中Ratpack和Spring Boot是天造地设的一对.它们都是以开发者为中心的运行于JVM之上的web框架,侧重于生产率.效率以及轻量级部署.他们在服务程序的开发中带来了各自的好处.R ...
- async 和 await 之异步编程的学习
async修改一个方法,表示其为异步方法.而await表示等待一个异步任务的执行.js方面,在es7中开始得以支持:而.net在c#5.0开始支持.本文章将分别简单介绍他们在js和.net中的基本用法 ...
- 你不知道的JavaScript--Item14 使用prototype的几点注意事项
1.在prototype上保存方法 不使用prototype进行JavaScript的编码是完全可行的,例如: function User(name, passwordHash) { this.nam ...
- scrapy顺序执行多个爬虫
# -*- coding:utf-8 -*- from scrapy import cmdline from scrapy.cmdline import execute import sys,time ...
- Spring Cloud 多版本管理那些事。
好久没有研究 Spring Cloud 了,也没有关注它的更新及新特性,上官网看了下,又增加了几个版本,有正式版有预览版,多达 6 个版本,实在让人蒙逼. 而我们的项目版本还仪停留在 Dalston ...
- Python数据运算
身份运算 is is是判断两个标识符是不是引用自一个对象 x is y, 如果id(x)等于id(y), is 返回结果1 is not is not 是判断两个标识符是不是引用自不同对象 x is ...
- BZOJ_1407_[Noi2002]Savage_EXGCD
BZOJ_1407_[Noi2002]Savage_EXGCD Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数C ...
- LOJ_6178_景区路线规划
LOJ_6178_景区路线规划 题意: 游乐园被描述成一张 nnn 个点,mmm 条边的无向图(无重边,无自环).每个点代表一个娱乐项目,第 iii 个娱乐项目需要耗费 cic_ici 分钟的时 ...
- java 判断是否为中文字符,部分,。中文符号不能识别
public static void main(String[] args) { int i = 0; for (char c : ",.判断一个字符串是否有中文一般情况是利用Unicode ...