JAVA_web Dom4j修改xml文档、xPth技术、SAX解析、xml约束、DTD约束、Schema约束

1 课程回顾

XML基础

1XML的作用

1.1 作为软件配置文件

1.2 作为小型的“数据库”

2XML语法(由w3c组织规定的)

标签:  

标签名不能以数字开头,中间不能有空格,区分大小写。有且仅有一个根标签。

属性:

可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单 双混用。

文档声明:

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

encoding="utf-8": 打开或解析xml文档时的编码

注意:

保存xml文档时的编码 和 解析xml文档时的编码要保持一致,才能避免中文乱码问题!

3XML解析

程序读取或操作xml文档

 

两种解析方式:   DOM解析   vs   SAX解析

 

DOM解析原理:一次性把xml文档加载成Document树,通过Document对象得到节点对象,通过节点对象访问xml文档内容(标签,属性,文本,注释)。

 

Dom4j工具(基于DOM解析原理):

读取xml文档:

    Document doc = new SAXReader().read("xml文件");

 

节点:

nodeIterator();  所有节点

标签:

element("名称")   指定名称的第一个子标签对象

elementIterator("名称");  指定名称的所有子标签对象

elements();  所有子标签对象

属性:

attributeValue(“名称”) 指定名称的属性值

attribute("名称")   指定名称的属性对象

getName()  属性名称

getValue()  属性值

atributeIterator()   所有属性对象(Iterator

attributes()       所有属性对象(List

文本:

getText()  得到当前标签的文本

elementText("子标签名称")  得到子标签的文本

今天的目标:     Dom4J修改xml   + xPath技术  + SAX解析 + XML约束

2 Dom4j修改xml文档

2.1 写出内容到xml文档

XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)

wirter.write(Document);

 

2.2 修改xml文档的API

增加:

DocumentHelper.createDocument()  增加文档

addElement("名称")  增加标签

addAttribute("名称",“值”)  增加属性

修改:

Attribute.setValue("")  修改属性值

Element.addAtribute("同名的属性名","")  修改同名的属性值

Element.setText("内容")  修改文本内容

删除

Element.detach();  删除标签  

Attribute.detach();  删除属性

3 xPath技术  

3.1 引入

问题:当使用dom4j查询比较深的层次结构的节点(标签,属性,文本),比较麻烦!!!

3.2 xPath作用

主要是用于快速获取所需的节点对象。

 

3.3 dom4j中如何使用xPath技术

1)导入xPath支持jar包 。  jaxen-1.1-beta-6.jar

2)使用xpath方法

List<Node>  selectNodes("xpath表达式");   查询多个节点对象

Node       selectSingleNode("xpath表达式");  查询一个节点对象

3.4 xPath语法

/      绝对路径      表示从xml的根位置开始或子元素(一个层次结构)

//     相对路径       表示不分任何层次结构的选择元素。

*      通配符         表示匹配所有元素

[]      条件           表示选择什么条件下的元素

@     属性            表示选择属性节点

and     关系          表示条件的与关系(等价于&&

text()    文本           表示选择文本内容

  3.5 案例

用户登录功能:

用户输入用户名和密码 -> 到“数据库”查询是否有对应的用户 ->

有: 则表示登录成功

没有: 则表示登录失败

 

xml当做数据库

user.xml   用来存储用户的数据

 

4 SAX解析


SAX解析原理图

JAVA_web Dom4j修改xml文档、xPth技术、SAX解析、xml约束、DTD约束、Schema约束


4.1回顾DOM解析

DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。

对内存要求比较要。

缺点: 不适合读取大容量的xml文件,容易导致内存溢出。

SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。

 

4.2 SAX解析工具

SAX解析工具-  Sun公司提供的。内置在jdk中。org.xml.sax.*

 

核心的API

   SAXParser类: 用于读取和解析xml文件对象

parseFile f, DefaultHandler dh)方法: 解析xml文件

参数一: File:表示 读取的xml文件。

    参数二: DefaultHandlerSAX事件处理程序。使用DefaultHandler的子类

例如:{

     1.创建SAXParser对象  

              SAXParser parser=SAXParserFactory.newInstance().newSAXParser();

                  2.调用parse方法

parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());

[一个类继承class 类名(extends DefaultHandler  在调用是创建传进去

 

DefaultHandler类的API:

void startDocument()  :  在读到文档开始时调用

void endDocument()  :在读到文档结束时调用

void startElement(String uri, String localName, String qName, Attributes attributes)  :读到开始标签时调用

void endElement(String uri, String localName, String qName)   :读到结束标签时调用

void characters(char[] ch, int start, int length)   读到文本内容时调用

 

============DOM解析    vs   SAX解析 ========

DOM解析

SAX解析

原理: 一次性加载xml文档,不适合大容量的文件读取

原理: 加载一点,读取一点,处理一点。适合大容量文件的读取

DOM解析可以任意进行增删改成

SAX解析只能读取

DOM解析任意读取任何位置的数据,甚至往回读

SAX解析只能从上往下,按顺序读取,不能往回读

DOM解析面向对象的编程方法(NodeElementAttribute,Java开发者编码比较简单。

SAX解析基于事件的编程方法。java开发编码相对复杂。

 

总结:

1Dom4j修改xml文档

 new XMLWrier();

......

2xPath技术: 快速查询xml节点

selectNodes()

selectSinglNode();

xpath表达式语言

3)  SAX解析

SAXParser parse

parser()

DefaultHandler类:

startElement();

characters();

endElement();

 

XML约束

XML约束要求:大家能够看懂约束内容,根据约束内容写出符合规则的xml文件

2.1 引入

XML语法: 规范的xml文件的基本编写规则。(由w3c组织制定的)

XML约束: 规范XML文件数据内容格式的编写规则。(由开发者自行定义)

2.2 XML约束技术

DTD约束:语法相对简单,功能也相对简单。学习成本也低。

Schema约束:语法相对复杂,功能也相对强大。学习成本相对高!!!(名称空间)

2.3 DTD约束

1)导入dtd方式

内部导入

<!DOCTYPE note [

  <!ELEMENT note (to,from,heading,body)>

  <!ELEMENT to      (#PCDATA)>

  <!ELEMENT from    (#PCDATA)>

  <!ELEMENT heading (#PCDATA)>

  <!ELEMENT body    (#PCDATA)>

]>

 

外部导入

本地文件系统:

<!DOCTYPE note SYSTEM "note.dtd">

 

公共的外部导入:

<!DOCTYPE 根元素 PUBLIC "http://gz.itcast.cn/itcast.dtd">

2DTD语法

约束标签

<!ELEMENT 元素名称 类别>   <!ELEMENT 元素名称 (元素内容)>

 

类别

空标签: EMPTY。 表示元素一定是空元素。

普通字符串: (#PCDATA)。表示元素的内容一定是普通字符串(不能含有子标签)。

任何内容: ANY。表示元素的内容可以是任意内容(包括子标签)

 

(元素内容):

顺序问题:

<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)> 按顺序出现子标签

 

次数问题:

标签     必须且只出现1次。

标签+  : 至少出现1

    标签*   0n次。

标签?   0 1次。

约束属性

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

 

默认值

#REQUIRED 属性值是必需的

#IMPLIED   属性不是必需的

#FIXED value 属性不是必须的,但属性值是固定的

 

属性类型:控制属性值的

CDATA :表示普通字符串

(en1|en2|..) 表示一定是任选其中的一个值

ID:表示在一个xml文档中该属性值必须唯一。值不能以数字开头

 

2.4 Schema约束

名称空间:告诉xml文档的哪个元素被哪个schema文档约束 在一个xml文档中,不同的标签可以受到不同的schema文档的约束。

 

 1)一个名称空间受到schema文档约束的情况

 2)多个名称空间受到多个schema文档约束的情况

 3)默认名称空间的情况

 4)没有名称空间的情况