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

这辈子没办法作太多事情因此每一件都要作到精彩绝伦css

People can't do too many things in my life,so everything will be wonderful   html

 

本文档参考资料w3cschool.CHM  API教程文档免费下载地址http://down.51cto.com/data/2300287java

XML技术

1.     什么是XML

XML 指可扩展标记语言EXtensibleMarkup Languagenode

XML 是一种标记语言很相似 HTMLweb

XML 的设计宗旨是传输数据而非显示数据编程

XML 标签没有被预约义。您须要自行定义标签。浏览器

XML 被设计为具备自我描述性。oracle

XML W3C 的推荐标准app

htmlxml的区别框架

html超文本标记语言。它主要是用来封装页面上要显示的数据最后经过浏览器来解析html文件而后把数据展现在浏览器上。一样咱们可使用JSDOM技术对html文件进行解析和操做。

xml可扩展的标记语言。它早期是为了代替html技术可是因为html书写的网页在全球占有率过高最后没有成功。

后期咱们开始使用xml文件做为软件的配置文件或者数据的存储文件以及传输数据的文件。

 

2.     XML做用

  • 存储和传输复杂的关系模型数据

  • 在软件系统中做为配置文件使用主要用途

为提升系统的灵活性它所启动的模块一般由其配置文件决定

例如一个软件在启动时它须要启动、两个模块而A、这两个模块在启动时又分别须要A1A2B1B2模块的支持为了准确描述这种关系此时使用文件最为合适不过。

3.     XML语法

一个XML文件分为以下几部份内容

文档声明

元素

属性

注释 

CDATA 、特殊字符

处理指令processing instruction

3.1     文档声明

l  在编写XML文档时须要先使用文档声明声明XML文档的类型。也就是告诉其余解析软件该文档是个XML文档。

l  最简单的声明语法

        <?xmlversion="1.0" ?>

l  encoding属性说明文档的字符编码常用的

        <?xmlversion="1.0" encoding="UTF-8" ?> 

l  standalone属性说明文档是否独立

        <?xmlversion="1.0" encoding=" UTF-8"  standalone="yes" ?>

wKioL1j1yj6wGCiwAAAdpuf_dNU501.png

拖入浏览器解析

wKioL1j1ykjREXCZAAAy4kk7e-k487.png

注意若是使用记事本编辑的话会解析错误中文乱码问题。只是使用记事本编辑的时候会出现其缘由以下

wKiom1j1ylKjSGY6AABxDxN9zE0571.png

 

l  常见错误

1. <?xml version=1.0 ?> 属性没加引号

2. <?xml version=1.0” ?> 全角空格

3.编码错误

 

3.2     元素element

  • XML元素指XML文件中出现的标签一个标签分为开始标签和结束标签一个标签有以下几种书写形式例如

包含标签体<a>wyait.blog.51cto.com/</a>

不含标签体的<a></a>,简写为<a/>

  • 一个标签中也能够嵌套若干子标签。但全部标签必须合理的嵌套绝对不容许交叉嵌套例如

                   <a>welcometo <b> wyait.blog.51cto.com/</a></b>

  • 格式良好的XML文档必须有且仅有一个根标签其它标签都是这个根标签的子孙标签。

  • 对于XML标签中出现的全部空格和换行XML解析程序都会看成标签内容进行处理。例以下面两段内容的意义是不同的。

第一段

<网址> wyait.blog.51cto.com</网址>

第二段

<网址>

         wyait.blog.51cto.com

</网址>

因为在XML中空格和换行都做为原始内容被处理因此在编写XML文件时使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。

  • 命名规范

一个XML元素能够包含字母、数字以及其它一些可见字符但必须遵照下面的一些规范

  • 区分大小写例如<P><p>是两个不一样的标记。

  • 不能以数字开头

  • 不能包含空格

  • 名称中间不能包含冒号: --- Schema约束冲突

  • 不建议"_"(下划线)开头

  •      属性

  • 一个标签能够有多个属性每一个属性都有它本身的名称和取值例如

                   <inputtype=“text”>

  • 属性值必定要用双引号"或单引号'引发来

  • 定义属性必须遵循与标签相同的命名规范

  • XML技术中标签属性所表明的信息也能够被改为用子元素的形式来描述例如

                   <input><type>text</type></input>

3.4     注释

  • Xml文件中的注释采用“<!--注释-->”格式。

注意

XML声明以前不能有注释

注释不能嵌套例如

         <!--大段注释

         ……

                   <!--局部注释-->

         ……

         --> 

3.5     CDATA

  • 在编写XML文件时有些内容可能不想让解析引擎解析执行而是看成原始内容处理。

  • 遇到此种状况能够把这些内容放在CDATA区里对于CDATA区域内的内容XML解析程序不会处理而是直接原封不动的输出。

语法<![CDATA[ 内容 ]]>

         <![CDATA[

                   <wyait>

                            <br/>

                   </wyait >

         ]]>

<demo>

    <!--

        当咱们但愿把一些文本原样的显示在浏览器中时

        可使用xml中提供的cdata区域

       

        格式

            <![CDATA[须要原样显示的数据]]>

           

        因为CDATA区域书写麻烦可使用特殊字符

            &lt;   <

            &gt;   >

    -->

    <![CDATA[

        <h1>html表示的是标题标签

        <br>html表示换行

    ]]>

   

    &lt;h1&gt;html表示的是标题标签

   

</demo>

3.5.1       转义字符

l 对于一些单个字符若想显示其原始样式也可使用转义的形式予以处理。

wKioL1j1yl_RaAulAAAGD4AXn_g028.png

常见的XML转义字符记录以下:

         空格: <string name="out_bound_submit">出&#160;&#160;库</string> 其中的&#160;就表明空格!解析的时候,空格仍是空格!

       换行: <string name="hello_world">你好!\n世界!</string> 其中的\n就表明换行

       缩进: <string name="hello_world">你好!\t世界!</string> 其中的\t就表明按一次Tab键的几个空格

            应当注意,因为系统定义的基本的缩进的格数不一样,有的表明4个半角字符,有的表明8个半角字符, 因此可能显示时效果不一样。

        若是在xml配置中使用了换行、空格、缩进等,解析的时候会把换行、空格、缩进解析为\n、 空格、\t等转义字符!以下:

        wKioL1j5eITgI3dLAAA9YvkAeRc346.jpg

解析的时候:

wKiom1j5eEyAYZY5AAAnHvA8L9g128.jpg

代码中会致使,自己配置的放行路径,结果没有放行!

wKioL1j5e96znxGeAAD136q4jZA620.png

3.6     处理指令processing instruction

  • 处理指令简称PI processinginstruction。处理指令用来指挥解析引擎如何解析XML文档内容。

 

  • 例如在XML文档中可使用xml-stylesheet指令通知XML解析引擎应用css文件显示xml文档内容。        <?xml-stylesheettype="text/css" href="1.css"?>

 

  • 处理指令必须以“<?”做为开头以“?>”做为结尾XML声明语句就是最多见的一种处理指令。

 

3.7     总结

l 全部XML 元素都须有关闭标签

l XML 标签对大小写敏感

l XML 必须正确地嵌套顺序

l XML 文档必须有根元素(只有一个)

l XML 的属性值须加引号

l 特殊字符必须转义--- CDATA

l XML 中的空格、回车换行会解析时被保留

4.     XML约束

  • 什么是XML约束

XML技术里能够编写一个文档来约束一个XML文档的书写规范这称之为XML约束。

  • 为何须要XML约束

经常使用的约束技术

XML DTD

XML Schema XSD

4.1     DTD约束

DTD的快速入门

1、先建立一个xml文件

 wKiom1j1ymvRH28IAAAzPjcdh90141.png

2、书写一个DTD文件

dtd文件的扩展名必须是dtd

xml中有多少个标签在dtd中就书写多少个ELEMNT

wKioL1j1yn3Ri1sgAAApI5EeNRY006.png

3、在xml文件中导入DTD的约束

 wKioL1j1yozikVnxAAA8wHMSNxo659.png

4.1.1       DTD约束语法

DTDxml文件的结合方式

  • 使用内部DTD

能够把dtdxml书写在同一个文件中

<!DOCTYPE 根标签名 [

dtd的约束

] >

XML文件使用 DOCTYPE 声明语句来指明它所遵循的DTD文件DOCTYPE声明语句有两种形式

 当引用的文件在本地时外部DTD采用以下方式

              <!DOCTYPE文档根结点 SYSTEM "DTD文件的URL">

       例如 <!DOCTYPE books SYSTEM“book.dtd”>xml文件中手写一下。

l 当引用的文件是一个公共的文件时公共DTD采用以下方式 

              <!DOCTYPE文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

              例如<!DOCTYPE web-app PUBLIC

              "-//SunMicrosystems, Inc.//DTD Web Application 2.3//EN"

              "http://java.sun.com/dtd/web-app_2_3.dtd">

4.1.2       DTD的元素ELEMENT定义

wKiom1j1yprz_S0JAAAdwPR0Fr4861.png

 

DTD中使用 ELEMENT 声明当前xml中能够出现的标签名称 () 限制当前这个标签中的文本或者子标签。

 wKiom1j1yqXBl7NuAAAFDU07CQA180.png

告诉咱们  当前的xml中能够有一个 books 标签在这个books标签下能够有一个或多个book子标签。

当前括号中的这个标签能够出现一次或屡次

当前括号中的这个标签能够出现零次或一次

当前括号中的这个标签能够出现零次或屡次

 wKioL1j1yq7iTPI-AAAG498frmY180.png

括号中的逗号是在定义出现的子标签的顺序。

 wKioL1j1yrehvNsSAAAGN9MffE4633.png

当前这个name标签中能够书写文本

 

4.1.3       属性ATTLIST定义

 wKiom1j1yr-TpqiXAAAXMdQ9EZg751.png

<!ATTLIST  标签名 

属性名  属性类型  属性约束

属性名  属性类型  属性约束

...

wKiom1j1ysuAC1OhAAA1fklk3PI238.png

wKioL1j1ytjQsOJyAAASWAL_k8M245.png

wKioL1j1yuPDkQSjAAAHjOjUoyA340.png

当前book标签上有一个abc属性这个属性的值是一个文本可是这个必须是必须书写的不能省略。

 

 

 

4.1.4       实体ENTITY定义

wKiom1j1yu2gmaWmAAAgGUhk6Ew521.png

相关标签参考

wKioL1j1yvfjZb8jAAB-oouXhJw666.png

4.2     Schema约束XSD约束

4.2.1       Schema概述

XML Schema是用一套预先规定的XML元素和属性建立的这些元素和属性定义了XML文档的结构和内容模式。 XML Schema规定XML文档实例的结构和每一个元素/属性的数据类型

 

Schema相对于DTD的明显好处是XMLSchema文档自己也是XML文档而不是像DTD同样使用自成一体的语法

  • SchemaDTD区别

XMLSGML中继承了DTD并用它来定义内容的模型验证和组织元素。同时它也有不少局限

    DTD不遵照XML语法

    DTD不可扩展

    DTD不支持命名空间的应用

    DTD没有提供强大的数据类型支持只能表示很简单的数据类型。

Schema彻底克服了这些弱点使得基于Web的应用系统交换XML数据更为容易。下面是它所展示的一些新特性

    Schema彻底基于XML语法不须要再学习特殊的语法

    Schema能用处理XML文档的工具处理而不须要特殊的工具

    Schema大大扩充了数据类型支持booleansnumbersdates and timesURIsintegersdecimal numbersreal numbers

    Schema支持原型也就是元素的继承。如咱们定义了一个联系人数据类型而后能够根据它产生朋友联系人客户联系两种数据类型

    Schema支持属性组。咱们通常声明一些公共属性而后能够应用于全部的元素属性组容许把元素、属性关系放于外部定义、组合

    开放性。原来的DTD只能有一个DTD应用于一个XML文档如今能够有多个Schema运用于一个XML文档。

4.2.2       Schema基本概念
  • XML Schema 文件自身就是一个XML文件但它的扩展名一般为.xsd

  • XML文件同样一个XMLSchema文档也必须有一个根结点但这个根结点的名称为Schema

  • 应用schema约束 开发xml 过程

W3C预先定义元素和属性-àSchema文档模式文档约束文档-àXML文档实例文档

 

  • 编写了一个XMLSchema约束文档后一般须要把这个文件中声明的元素绑定到一个地址上这个URI地址叫namespace名称空间之后XML文件就能够经过这个URI即名称空间引用绑定指定名称空间的元素

  • XML Schema文档基本结构

W3C XML schema规范中规定全部的Schema文档都使用<schema>做为其根元素

wKioL1j1ywWyRjb4AAAUJvxpCCY186.png

<schema>元素能够包含一些属性。一个XMLschema声明看起来常常以以下的形式出现

wKiom1j1yw6x7Cj5AAAychXZg90720.png

4.2.3       Schema快速入门

1、定义一个xml文件

wKioL1j1yxiw_4e2AAAzTahp3oY733.png

 

二、书写一个Schema文件

wKiom1j1yyPQV8OwAAAxZt-_BfI168.png

 

Schema文件中  必须以 schema做为 Schema文件的根标签。

 

xmlns="http://www.w3.org/2001/XMLSchema"

它的含义是表示当前的Schema文件是被当前指定的url名称空间所约束。

 

targetNamespace="http://www.example.org/books"

给当前这个Schema文件起名字当须要被当前这个Schema文件约束的xml文件须要经过当前这个名字引入当前Schema文件。

targetNamespace属性对应的属性值能够是任意的内容。好比targetNamespace="http://www.huyouta.com/books"

 

<schema xmlns="http://www.w3.org/2001/XMLSchema"

    targetNamespace="http://www.huyouta.com/books"

    elementFormDefault="qualified">

   

    <!--

        在Schema文件中书写当前xml中能够出现的标签 以及子标签 等信息

        一、先清楚xml中须要多少标签在Schema文件中就书写多少个element标签

        二、element标签中的 name属性 就是xml中 能够书写的标签的名字

        三、在Schema中它把xml中能够出现的标签分红简单标签和复杂标签

            简单标签只有文本数据的标签成为简单标签

            复杂标签若是标签上有属性或者有子标签或者有属性和子标签 或 属性和文本的标签复杂标签

        四、针对复杂标签须要在当前的标签中书写子标签来限制当前复杂标签中的其余内容

            在element标签中须要使用complexType声明当前的element标签name属性指定的是一个复杂标签

            若是是简单标签可使用simpleType

        五、对于复杂标签须要在 complexType中书写sequence 标签表示子标签的顺序

       

     -->  

    <elementname="books">  <!--books 是一个复杂标签 -->

        <complexType>

            <sequence>  <!-- 定义当前books 标签中的子标签的顺序-->

                <element name="book">

                    <complexType>  <!-- 声明当前的book 又是一个复杂标签-->

                        <sequence>

                            <!-- 在element 标签中的 type属性来限制当前单标签中文本的类型 -->

                            <elementname="name"  type="string"></element>

                            <elementname="author"type="string"></element>

                            <elementname="price"type="double"></element>

                        </sequence>

                    </complexType>

                </element>

            </sequence>

        </complexType>

    </element>

</schema>

 

3、在xml文件中引入Schema文件

 

xmlns="http://www.huyouta.com/books"

xml中引入 Schema文件的名称

 

<?xml version="1.0" encoding="UTF-8"?>

<books  xmlns="http://www.huyouta.com/books"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.huyouta.com/booksbooks.xsd"

> 

    <book>

        <name>葵花宝典</name>

        <author>班长</author>

        <price>9.9</price>

    </book>

</books>

4.2.4       名称空间

声明文档空间

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

                     targetNamespace="http://www.huyouta.com/books "

                     elementFormDefault="qualified"

                     attributeFormDefault="unqualified"

<xs:schema>

targetNamespace元素用于指定schema文档中声明的元素属于哪一个名称空间。

elementFormDefault元素用于指定局部元素是否受到该schema指定targetNamespace所指定的名称空间限定

attributeFormDefault元素用于指定局部属性是否受到该schema指定targetNamespace所指定的名称空间限定

总结

  • 在书写Schema文件的时候须要在Schema文件中 使用 targetNamespace 属性 给当前的Schema文件起名。

  • targetNamespace属性的值作为当前 Schema文件的名称空间。

  • xml文件中 须要 经过 xmlns 来引入不一样名称下的Schema文件。

  • 若是咱们在同一个 xml文件中引入了多个Schema的名称空间这时须要你们给这些名称空间其别名。

  • 若是在xml文件使用了多个 xmlns引入多个名称空间时须要在xmlns后面使用冒号给当前的名称空间起名。经过这个别区分到底当前xml中的标签受限于具体哪一个Schema文件。

wKiom1j1yzSjg-jRAABpxt9OUlM983.png

5.     XML解析

  • DOM-Document Object Model-文档对像模型。是w3c组织处理xml的一种方式。

特色

一次将全部数据所有加载到内存中。

xml文档中的每个节点都当成一个Node对像处理。包括元素、文本、属性。

org.w3c.dom包中的Document,Element,Node

很是方便进行修改。

已经集成在了JDK中是Sunxml操做的标准。

缺点是当文档数据量很大时对内存的占用很大。

Sax Sample Api for XML

在读取数据时分析数据经过事件监听器来完成。

速度快但只适合读取数据仅向前读取不可后退。

  • xml可扩展的标记语言。

无论是html文件仍是xml文件它们都是标记型文档均可以使用w3c组织制定的dom技术来解析。

wKioL1j1y0GCN_ugAAAsrRh6odE231.png

dom解析技术是W3C组织制定的而全部的编程语言都对这个解析技术使用了本身语言的特色进行实现。

 

Javadom技术解析标记型文档也作了实现

早期sun公司就制定的 dom 技术。而这个技术在页面xml的时候须要把整个xml文件加载到内存中能够根据getElementByIdgetElementsByName getElementsByTagName 等方法解析。

 

sun公司在JDK6版本对 dom解析技术进行升级 SAX解析 Stax 解析

sun公司的解析统称 JAXP

5.1     解析XML的方式

  • JAXP(JavaApi for Xml Programming) sun公司的一套操做XMLAPI.

  • DOM解析-一次性的将数据所有装入内存。

  • SAX解析-边读取边解析。

  • Dom4j(Document For Java)-第三方开源是从jdom分裂出来的解析技术。目前jdom已经彻底被dom4j替代。

  • jDom Dom4j的前身。

  • Dom4j在性能和速度上都比sun公司的要快并且支持Xpath快速查找目前像Spring,Hibernate这些大型的框架都是用的dom4j.

  • StAX JDK1.6新特性作为JAXP的新成员已经集成在了JDK6当中。

  •      Dom4j

Dom4j是一个开源、灵活的XML API

目前不少开源框架如struts,hibernate都使用dom4j作为解析其xml的工具。

支持文档的读写功能和Xpath快速查询操做。

 

因为dom4j 它不是sun公司的技术而属于第三方公司的技术咱们须要使用dom4j 就须要到dom4j官网下载dom4jjar包。

wKiom1j1y1GSoSpAAAADzBQYmZQ680.png

wKioL1j1y1yDKzCgAAAfnWv8zPM963.png

dom4jjar包拷贝咱们的项目中

在本身的项目中新建一个lib文件把dom4j jar包拷贝到其中

wKioL1j1y2WidyXoAAAQGV1scrk904.png

jar包添加到当前的classpath路径中

wKioL1j1y3KTjFG_AABBZ1ZVI6Q626.png


 

 

5.2.1       获取document对象

wKiom1j1y4HgZRU9AAAxG3RTgT8608.png

//注意如下类都来自于org.dom4j

//1、实例化解析器

SAXReader sax = newSAXReader();

//2、读取xml文档

Document doc =sax.read("./src/xml/a.xml");

//3、必须先获取根节点

Element root =doc.getRootElement();

//4、获取第一我的的姓名

String name =root.element("user").element("name").getText();

System.err.println(name);

 

5.2.2       获取全部标签中的文本值

    //演示使用dom4j 获取 xml中的标签中的数据

    publicstaticvoid getElement()throws Exception{

        SAXReader reader = new SAXReader();

        // 获取dom

        Document dom = reader.read("users.xml");

       

        //获取xml中的根标签

        Element root = dom.getRootElement();

       

        //获取根标签下的全部子标签

        List<Element> list =root.elements();

       

        //遍历集合获取到每一个 user标签

        for (Element e : list) {

           Elementname = e.element("name");

           Elementage = e.element("age");

           Elementsex = e.element("sex");

           System.out.println(name.getText() + ":" + age.getText()+":"+ sex.getText());

        }

    }

 

 

5.2.3       修改指定标签中的值

    //把最后一个user中的sex 修改成女

    publicstaticvoid UpdateElement()throws Exception{

        SAXReader reader = new SAXReader();

        // 获取dom

        Document dom = reader.read("users.xml");

       

        //先获取根标签

        Element root = dom.getRootElement();

        //获取 users 下的全部user标签

        List<Element> list =root.elements();

        

        //获取最后一个user标签

        Element lastUser =list.get(list.size()-1);

       

        Element sex = lastUser.element("sex");

       

        sex.setText("");

       

        //把内存中修改后的dom树从新写到xml文件中

        //建立用于写出数据的流对象

        //XMLWriter writer = new XMLWriter(newFileOutputStream("users.xml"));

       

        //建立一个格式器

        OutputFormat format = OutputFormat.createPrettyPrint();

        //设置编码表

        format.setEncoding("gbk");

       

        XMLWriter writer = new XMLWriter(new FileWriter("users.xml") ,format );

        //写出数据

        writer.write(dom);

        //关流

        writer.close();

       

    }

 

 

5.2.4       删除标签

 

    // 删除

    publicstaticvoid deleteElement() throws Exception {

        SAXReader reader = new SAXReader();

        // 获取dom

        Document dom = reader.read("users.xml");

 

        // 删除最后一个user标签

 

        // 先获取根标签

        Element root = dom.getRootElement();

        // 获取 users 下的全部user标签

        List<Element> list = root.elements();

 

        // 获取最后一个user标签

        Element lastUser = list.get(list.size() -1);

 

        root.remove(lastUser);

 

        XMLWriter writer = new XMLWriter(newFileOutputStream("users.xml"));

        writer.write(dom);

        // 关流

        writer.close();

 

    }

 

 

5.2.5       增长标签

 

    // 建立一个新的dom写到文件

    publicstaticvoid addElement() throws Exception {

 

        // 先建立一个dom树这个dom树在内存中

        Document dom = DocumentHelper.createDocument();

 

        // 给树上添加根节点

        Element books = dom.addElement("books");

 

        // 给根books上添加了2book 标签

        Element book = books.addElement("book");

        Element book2 = books.addElement("book");

 

        // book标签上添加子标签

        Element name = book.addElement("name");

        Element author = book.addElement("author");

        Element price = book.addElement("price");

 

        // book下的子标签中添加文本

        name.setText("九阴真经");

        author.addText("李白");

        price.addText("1.1");

 

        // book标签上添加子标签

        Element name2 = book2.addElement("name");

        Element author2 = book2.addElement("author");

        Element price2 = book2.addElement("price");

 

        // book下的子标签中添加文本

        name2.setText("九阳神功");

        author2.addText("赵敏");

        price2.addText("1.2");

 

        // book标签上添加属性

        book.addAttribute("addr", "藏经阁");

        book2.addAttribute("addr", "桃花岛");

       

        OutputFormat format = OutputFormat.createPrettyPrint();

        XMLWriter writer = new XMLWriter(newFileOutputStream("books2.xml"),format);

        writer.write(dom);

        // 关流

        writer.close();

    }

 

 

5.2.6       工具类抽取

 

/**

 * 这时一个工具类它的功能是完成对dom数的获取和保存

 *

 * @authorwyait

 * @version 1.0

 */

publicclass DomUtils {

   

    privatestatic Document dom = null;

   

    static{

        try{

            SAXReaderreader = new SAXReader();

            // 获取dom

            dom = reader.read("users.xml");

        }catch( Exception e ){

            //把异常写到日志文件中

            System.out.println("恭喜您获取dom树失败");

        }

    }

    /**

     * 用于获取dom树的方法

     */

    publicstatic DocumentgetDom(){

        returndom;

    }

   

    /**

     * 保存dom

     */

    publicstaticvoid saveDom(){

        try{

            OutputFormatformat = OutputFormat.createPrettyPrint();

            XMLWriterwriter = new XMLWriter(new FileOutputStream("users.xml"),format);

            writer.write(dom);

            // 关流

            writer.close();

        }catch(Exception e){

            System.out.println("恭喜您保存dom树失败");

        }

    }

}

 

5.2.7       Dom4j生成一个新的XML文件

//1、经过DocumentHelper在内存中建立一个Document

Document doc = DocumentHelper.createDocument();

doc.setXMLEncoding(UTF-8);//XML的编码格式

//生成一个节点,生成的第一个节点也是根节点此方法只使用一次

Element root =doc.addElement(“users”);

root.addElement(user).setText(Jack);//再设置一个子节点同时设值

//写出,若是有中文请使用前一页所讲的技术处理

XMLWriter writer= new XMLWriter(new FileOutputStream(“a.xml”));

Writer.write(doc);

Writer.close();

5.3     xpath技术偏理论

xpath技术 也是 W3C 组织制定的 快速获取 xml 文件中某个 标签的 技术。

l  XML PATH Language

l  能够实现快速查询。

l  XPATH包含

  XPath 使用路径表达式在XML 文档中进行导航。

  XPath 包含一个标准函数库

l  准备Xpath的包

  jaxen.jar

l  Xpath经过如下方法使用

  dom.selectNodes – 返回一个List对像

  dom.selectSingleNode – 返回一个Node对像

 

wKiom1j1y5LgkJvEAABQSSkYDm8452.png

5.3.1       Xpath示例

//如下选择全部的user节点,处理不带命名空间的安如下原则

List<Element> list =doc.selectNodes("//user");

System.err.println(list.size());

//如下选择全部name节点

list = doc.selectNodes("//name");//或从要开始:/users//name

System.err.println(list.size());

 

//如下选择所在带有country属性的节点

list = doc.selectNodes("//user[@country]");

System.err.println(list.size());

 

//选择国家是 EN的节点,可使用如下方法查询用户登陆

//若是country不能重复则可使用selectSingleNode

//使用双引号或单引号均可以//user

Node node =doc.selectSingleNode("//user[@country=\"EN\"]");

System.err.println(node);

 

xpath / 表示从根开始找标签    // 表示 不考虑标签的位置 只要匹配上就能够

 

//abc[@属性名选择abc标签可是要求abc 必须有指定属性名

 

wKioL1j1y5_wtZuUAACJpyMp8r0043.png

 

在使用xpath技术结合 dom4j 快速获取标签 发生了异常

报了类没有找到异常。这时通常状况下都是缺乏jar包。

通常若是缺乏jar包的话 在报的异常中的第二个单词或者第三个单词是jar包的名称。

 

  • 不区分大小写的解决方案

如下均为根据属性查询

//如下查询id元素为XXname属性为用户组的name值的创建所有转成小写

String path = "//user[fn:upper-case(@id)=‘XX"'and fn:upper-case(@name)='"+name+"']";

Node n=dom.selectSingleNode(path);//由于肯定有一个对象因此使用Single

或是转成小写如下查询id属性为hellobook元素

List list =dom.selectNodes("//book[fn:lower-case(@id)='hello']");

  • Xpath模糊查询属性

查询属性中包含某个值的元素相似于like

//book[contains(@id,’A001’)]

//查询bookid属性中包含A001字符串的

既然是模糊查询固然要进行一下大小写转换因此

//book[contains(fn:lower-case(@id),’a001’)]

  • Xpath经过查询子元素的值区别主要元素:不要使用@符号

XML文档以下

<books>

<book id=“A001”>

     <name>Oracle编程基础</name>

     <price>89.99</price>

</book>

</books>

查询包含Oracle一词的全部book元素。

//book[name=Oracle]   //精确查询子元素name的值为Oraclebook元素

//如下是模糊查询

//book[contains(name,’Oracle’)]

//也能够将name元素的值转成小写

//book[contains(fn:lower-case(name),’oracle’]

  • Xpath处理带有命名空间的XML文档

因为命名空间的namespace是组成元素的一部分即前缀因此处理带有命名空间的XML文档时必需要设置命名空间

wKiom1j1y6qCa6GUAAAychXZg90884.png

对于上面的文档全部的元素都来自于默认命名空间。

  • Xpath处理带有命名空间的XML文档

SAXReader sax = new SAXReader();

//声明一个map用于保存命名空间

Map<String,String> uris = newHashMap<String, String>();

//给命名空间取一个别名

uris.put("a","http://www.itcast.cn");

//设置命名空间后再读取xml文档

sax.getDocumentFactory().setXPathNamespaceURIs(uris);

Document dom =sax.read("./xml2/a.xml");

//而后使用带有命名空间的前缀查询便可。

dom.selectNodes(“//a:book”);

//带有属性的查询同前

dom.selectNodes(//a:book[@id]

//带有元素的查询必需要添加命名空间的前缀

dom.seletNodes(//a:book[a:name=oralce]);  //查询子元素值为oraclebook元素

 

6.     总结

l  SAXStAX读取速度快。都是JAXP的成员。

l  StAXIterator编程接口和Cursor编程接口。

l  Dom4jDom。都会将全部节点加载加载到内存中。CRUD很是方便。

l  Dom4j支持XPath.

相关文章
相关标签/搜索