您的位置:首页 > 编程语言 > Java开发

Java基础之XML解析

2018-01-27 09:34 183 查看
#### XML约束之Schema约束-命名空间的概述

* Schema的基本概念
1. Schema本身也是一个XML文件,后缀文件名是XSD
2. Schema本身也是一个XML文件,所以Schema也是需要被约束的,但Schema的约束由官方指定(W3C)
3. 一个XML文件可以有多个Schema约束,所以可能出现两个不同的Schema文件中的约束条件有相同的元素名的情况,所以需要命名空间
4. 一个实例文档在引入多个模式文档时,只能有一个模式文档是默认的,其他的必须写上前缀,默认的可以不使用前缀,理解为导包
5. 实例文档前两句都是在引入模式文档,一个是自己的一个是官方的

* Schema的相关概念之模式
* 模式文档:写了约束规则的Schema文件

* 实例文档:被约束的XML文件

#### 命名空间

1. 命名空间的引用格式(xmlns是引用文档的声明)
###第一句<schema xmlns:xs="http://wwww.w3.org/2001/XMLSchema">
1.在开始标签中使用  xmlns:前缀="URL地址"
2. URI地址可以是任意字符串,但需要是唯一的。地址的作用就是为了保证命名空间的唯一,一般使用公司网址,这个网址是不会被访问的,
3. 在eclipse中会自动生成这句,xmlns:xs="http://wwww.w3.org/2001/XMLSchema",这句话不需要改,
4. 上面那句话表示该模式文档使用的标签或数据类型来自于http://wwww.w3.org/2001/XMLSchema,因为Schema本身也是需要约束的,这句话就是表示官方对其的约束,这个网址里有Schema的约束规则。
5. 这句话还有一个作用,表示使用的标签或元素都要遵守这个网址里规定的规则,如element,complexType标签等。

###targetNamespace="http://www.itheima.com/note"
1. 当前模式文档的约束将被绑定到http://www.itheima.com/note

##命名空间的作用

* 默认命名空间
* 没有使用前缀的命名空间就是默认的命名空间
* 一个实例文档中只能有一个默认的命名空间。

* 命名空间的作用
* 要来告诉实例文档中使用的标签或属性来自于哪一个模式文档
* 可以避免标签名和属性名命名冲突。
* 使用前缀避免冲突问题。

* note.xsd模式文档的解释

1) schema 是每一个 XML 模式文档的根元素

    2) <schema> 元素包含属性 xmlns:xs="http://www.w3.org/2001/XMLSchema"
作用一:表示schema中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchema"。
作用二:规定了来自命名空间"http://www.w3.org/2001/XMLSchema"的元素和数据类型使用前缀xs访问。

    3) targetNamespace="http://www.itheima.com/note" 

    表示被此 schema 定义的元素 (note, to, from, heading, body) ,

    被绑定到了命名空间:"http://www.itheima.com/note"。

    4) elementFormDefault="qualified" 

    使用此xsd的实例文档必须遵守此文档的约束。

    5) note 元素是一个复合类型,因为它包含其他的子元素。

    6) <xs:sequence> 表示其中的子元素要按顺序出现

    7) 其他元素(to, from, heading, body) 是简易类型,因为它们没有包含其他元素。

* note.xml实例文档的解释

xsi 即 xml schema instance 简写

  1)指定XML Schema 实例命名空间:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

  2)使用xsi:schemaLocation属性

  第一个值是需要使用的命名空间。

  第二个值是供命名空间使用的XML 

  schema的位置:xsi:schemaLocation="http://www.itheima.com/note note.xsd"

  3)xmlns="http://www.itheima.com/note" 规定了默认命名空间的声明。

  此声明会告知schema验证器,在此XML文档中使用的所有元素的约束都来源于 

  "http://www.itheima.com/note"这个命名空间。也可以指定一个前缀,

  这里使用默认的命名空间,则可以省略前缀。

###XML解析概述

* XML解析概述
* 使用java技术获取XML文件中的数据的过程

* XML常用的解析方式
* DOM解析
* 概述:将整个XML文档加载到内存中并生成一颗DOM树
* 缺点:如果XML文档比较大,则会占据很多的内存空间,在PC端广泛使用,手机端基本不用
* 优点:可以在解析过程中对DOM树上的每一个结点进行增删改操作。

* SAX解析
* 概述:一行一行解析,解析一行释放一行,
* 缺点:只能读不能改
* 优点:对内存的占据少,,在手机端广泛使用。

###DOM4J解析
* dom4j概述
* 使用的解析方式就是DOM方式
* 是目前解析XML最优秀的框架,Hibernate默认就是使用dom4j解析XML

###DOM树的组成元素
1. 文档:Document(当我们用DOM解析方式将整个XML文件加载到内存时就会生成一个Document对象)
2. 节点:Node()
3. 元素:Element
4. 属性:Attribute
5. 文本:Text

## Document对象
概述:一个XML对应一个Document对象

### Node概述
概述:DOM树上的每个元素都是一个节点,所以节点是每个元素的父类

* Node常用方法  
* Iterator<Node> element.nodeIterator()

* short node.getNodeType()
* 获得节点类型
* Node.ELEMENT_NODE:元素节点
* Node.TEXT_NODE:文本节点
* Node.COMMENT_NODE:注释节点
* Node.ATTRIBUTE_NODE: 属性节点

* Element元素(标签)
* 常用方法 
* String getName():  获得元素名字
* Element element(name) :根据子元素的名称获得Elment对象,如果有多个,默认返回第一个
* List<Element> elements(): 获得当前元素下的所有子元素
* List<Element> elements(name):获得当前元素下指定名字的所有子元素

* Attribute属性
* 得到Attribute对象的前提:
* 先获得Element对象

* Attribute attribute(name):根据名字获得属性对象
* Attribute接口的方法
* String getName()  获得属性名
* String getValue() 获得属性值
* String attributeValue(name):根据属性名获得属性值
* List<Attribute> attributes() 获得指定元素下的所有属性对象,返回集合
* Iterator<Attribute> attributeIterator():获得指定元素下属性的迭代器对象

* 代码演示
* 分别使用2种方式,得到contact上id属性值

    * 在contact元素上添加一个vip的属性值为true/false

    * 分别使用迭代器和List得到contact上所有的属性名和属性值

* Text元素
* 注意事项

a22d
* 换行,制表符,空格都属于文本的一部分

 
* Element接口中对文本操作的方法
* element.getText(): 获得当前元素文本内容,不会去除前后空格
* element.getTextTrim():获得当前元素文本内容,会去除前后空格
* element.elementText(元素名): 根据子元素名获得子元素的文本内容,不会去除前后空格
* element.elementTextTrim(元素名): 根据子元素名获得子元素的文本内容,会去除前后空格

* 代码演示
* 得到第1个contact中的name元素,输出name元素的文本。

### XML解析之数据的封装

* 需求
* 创建实体类Contact,包含属性:id、name、gender、phone、qq、email,属性全部使用String类型
* 将XML文件中的联系人封装成一个List<Contact>集合,并输出在控制台
* 1) 得到根元素
* 2)得到所有的contact元素
* 3) 得到contact元素中的下级元素封装成数据,其中id是属性,其它的都是文本。 

###XMLWriter的使用
XMLWriter构造方法

    * XMLWriter(OutputStream out, OutputFormat format) 

    * 创建XMLWriter对象

    * out:字节输出流,关联文件

    * format:输出格式对象

    * OutputFormat.createCompactFormat() 

    * 创建紧凑型格式化对象,所有的标签属性都在一行显示。

    * OutputFormat.createPrettyPrint()

    * 创建漂亮格式化对象, 会自动换行,一个标签占据一行

XMLWriter常用方法
* void write(Document doc) 

  * 写出一个文档对象

 

  DocumentHelper类常用方法

  * Document createDocument(); 创建文档对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: