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~

原文地址:https://www.cnblogs.com/story-xc/p/10771517.html

时间: 2024-10-22 06:05:18

Dom4J配合XPath解析schema约束的xml配置文件问题的相关文章

利用XPath解析带有xmlns的XML文件

在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中加入了xmlns表示名称空间,但同时Xpath也必须加上. 如之前我们的xml文件定义为: <Project Name="目标计划项目"> <Process Name="个人月度计划" Description="个人月度计划" Ve

XML技术-Schema约束-Dom4j-Xpath详解

这辈子没办法做太多事情所以每一件都要做到精彩绝伦 People can't do too many things in my life,so everything will be wonderful   乔布斯 本文档参考资料w3cschool.CHM  API教程文档免费下载地址http://down.51cto.com/data/2300287 XML技术 1.     什么是XML XML 指可扩展标记语言EXtensibleMarkup Language XML 是一种标记语言很类似 H

XML的DTD和Schema约束

为什么要使用约束? XML是自定义的标签,有时候标签太多,记不住,所以就需要有约束来告诉我能写哪些标签,哪些标签写错了不能识别 XML中有哪几种约束? 有很多约束,其中DTD和Schema约束最为常见. 约束本质上是什么? 约束本质上也是一种xml文件. DTD约束和Schema约束的区别 特点的区别: DTD约束较为古老,简单,一些老框架使用DTD作为约束:Struts2和Hibernate都使用DTD作为其XML配置文件的约束 Schema约束功能更为强大,用的更为广泛,Tomcat和Spr

SCHEMA约束

SCHEMA约束: 一个xml文档中可以添加多个schema约束 xml和schema的关联. 格式: <根标签 xmlns="..." ...> <根标签 xmlns:别名="..." ...> 名称空间: 关联约束文件 规定元素是来源于那个约束文件的 例如: 一个约束文件中规定 table(表格)  表格有属性 row和col 还有一个约束文件规定 table(桌子) 桌子有属性 width和height 在同一个xml中万一我把两个约束

Java 模拟servlet执行、DTD约束、Schema约束、dom4j解析(读写xml)

模拟servlet执行 浏览器请求WEB服务器上的资源,WEB服务器返回给浏览器 浏览器的入口不同(访问路径),访问的资源也不同. 我们需要使用xml约束(DTD或schema);为了获得xml的内容,我们需要使用dom4j进行解析. XML(不同路径(/hello)执行不同的资源( HeIIoMyServlet)) XML可扩展的标记语言  标签可自定义的 包下创建xml 文件   new → other  →  XMLFile 粘贴web-app_ 2_ 3.dtd文件 复制web-app_

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使

JavaWeb-06(Dom4j技术及Schema 约束、Tomcat与Web程序结构)

JavaWeb-06 JavaWeb-Dom4j技术及Schema 约束.Tomcat与Web程序结构 DOM4J及Schema 一.Dom4j解析(掌握) DOM4J解析XML文档 a. Dom4j是一个简单.灵活的开放源代码的库.Dom4j是由早期开发JDOM的人分离出来而后独立开发的.与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性. b. Dom4j是一个非常优秀的Java XML API,具有性能优异.功能强大和极

xml初步,DTD和Schema约束

XML 可扩展的标记语言(!!!可扩展) 作用 1.存放数据 2.配置文件 语法 文档声明 <?xml version="1.0" encoding="UTF-8"?> 1.文档声明必须为<?xml开头,以?>结束: 2.文档声明必须从文档的0行0列位置开始: 3.文档声明只有2个属性: version 版本 encoding 编码 元素 <bean></bean> 1.必须开始结束 2.标签由开始标签,元素体,结束标

第1天 XML和DTD、schema约束

1.xml * 扩展名:*.xml * 作用:存储.配置 一个XML文件分为如下几部分内容:文档声明.元素.属性.注释  CDATA区.特殊字符.处理指令(processing instruction). 1.1文档声明 最简单的声明语法: <?xml version="1.0" ?> version:设置当前xml文档内容使用的版本 用encoding属性说明文档的字符编码: <?xml version="1.0" encoding="