Java基础 XML解析

来源:互联网 发布:照片数字识别软件 编辑:程序博客网 时间:2024/06/05 15:36
XML基础
Xml基本介绍
问题:什么是xml,它的作用是什么?
XML 指可扩展标记语言
所谓的可扩展标记语言,简单说就是指xml文件中的标签可以任意定义。
XML 被设计用来传输和存储数据。
问题:xml它存储的是什么样数据?
Xml中存储的是有关系的数据。
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
xm
Xml也可以形成一个树型结构,它里面每一个叫做节点,节点也分成了
元素结点(Element) 属性节点(Attribute) 文本节点(Text) 整体也是一个节点,它叫做document.
Xml在实际开发中,它的真正作用?
  1. 将xml做为配置文件
  2. 通过xml可以在不同的系统之间传递数据

Xml基本组成
首先,xml文件它的后缀名就是.xml,我们可以直接使用文本编辑器来对xml文件进行处理。
在xml文件中它有以下几部分
  1. 文档声明
  2. 属性
  3. 元素
  4. 注释
  5. CDATA
  6. PI指令(了解一下)
文档声明
它的主要作用就是说明当前文件是一个xml
文档声明有三个属性,而version encoding是常用的。还有一个属性叫做standalone它不常用。
  1. version 它是版本 它的值常用的是1.0
  2. encoding它的主要作用是声明当前xml文件的字符编码
  3. standalone 它的作用是描述文档是否是一个独立文档

属性
在xml文件中属性它的值必须使用引号引起来(双引号与单引号都可以)。
在实际开发中,经常会使用子标签来替换属性。
<a type=”xxx”></a>
可以使用子标签来替换属性
<a>
<type>xx</type>
</a>

元素
元素就是指标签
在xml中所有的标签必须有结束。
有开始有结束<a></a>,如果标签没有标签体可以自关闭<a/>
格式良好的xml文件,它有且仅有一个根标签。其它所有的标签都是这个根标签的子孙元素
Xml中的元素是可以嵌套的,但是不能交叉嵌套。
在xml文件中空格换行都会被视频内容解析。
关于标签名称的规范:
  1. xml区分大小写 <a> <A>这是两个标签。
  2. 不能以数字或”_”(下划线)开头
  3. 不能以xm(Xml XML)开头
  4. 标签中不能包含空格
  5. 名称中间不能包含(:)冒号

注释
在xml文件中它的注释与html中一样
<!—注释内容 -->
在xml文件中第一句话只能是文档声明,注释都不可以。
注释不可以嵌套。

CDATA区域
CDATA区域中的内容不会被解析,而是原样展示。
在xml中也存在一些特殊字符.
&lt; <
&gt; >
PI指令



Xml语法规则总结
  1. 所有的 xml标签必须关闭
  2. xml标签对大小写敏感
  3. xml标签必须正确嵌套
  4. xml文档有且只有一个根元素
  5. xml属性必加引号引起。
  6. xml中的空格会被保留,对于特殊的字符必须转义才可以使用

 Xml约束介绍
在xml技术中,我们可以编写一个文档来约束一个xml文件的书写的内容规范,这个就称之为xml约束。
简单说,约束就规定了xml文件中可以写什么,不可以写什么。
为什么使用约束?
因为xml书写太随意,在对信息进行描述时,如果没有约束,我们是不知道,xml文件如果定义信息。所以必须规定xml文件中可以写什么,也就是定义其规范,这样才可以通过xml文件进行传输信息。

在xml技术中有哪些xml约束?
  1. DTD约束
文档类型定义(DTD)可定义合法的XML文档构建模块
Document type definition
Dtd文件后缀名就是dtd
  1. SCHEMA约束
Schema文件它就是一个xml文件,只不过它的文件后缀名是xsd.
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

DTD约束
Dtd约束文件的后缀名是.dtd.
Dtd快速入门
  1. 创建一个文件
  1. 创建一个dtd文件

DTD约束详解
DTD元素
格式1 <!ELEMENT 元素名称 类别>
格式2 <!ELEMENT 元素名称 (元素内容)>
在dtd中特殊符号:
? 表示对象可以出现,但是只能出现一次。
* 表示对象可以出现0次或多次
+ 表示对象可以出现1次或多次。
() 用于元素分组
| 表示在列出的对象中选择一个
,(逗号) 表示该对象必须按照指定的顺序出现。
元素类别
#PCDATA
表示元素可以包含任意字符,但是不能是子元素。
ANY
表示可以是任意的内容
EMPTY
表示元素不可以包含任何内容,只能使用属性。

DTD属性
声明属性格式
<!ATTLIST 元素名称 属性名称 属性类型 默认值>

属性类型:
  1. CDATA 就代表当前是一个字符符
  2. (值1|值2|…..) 枚举类型,代表只能从其中选择一个值
  3. ID 值是唯一

默认值
自定义实体
语法
<!ENTITY 实体名称 "实体的值">
现在的浏览器不支持实体的外部引入,所以只能在内部声明

DTD与xml关联
  1. 内部关联
  1. 外部关联
    1. 关联本地文件
格式<!DOCTYPE xml文件根元素 SYSTEM “DTD文件的本地URL”>
    1. 关联网络上公共文件
格式 <!DOCTYPE 文件根元素 PUBLIC “DTD名称” “DTD文件的URL”>

SCHEMA约束
Schema约束它是dtd替代者。Schema约束文件的后缀名是xsd
Dtd与schema区别
  1. dtd不遵守xml语法,而schema它遵守xml语法,它本质上就是一个xml
  2. dtd数据类型不完善,而schema它有丰富数据类型
  3. dtd只能有一个应用于xml文件,使用schema可以多个schema约束xml文件。

Schema快速入门
元素我们可以分为两种:
  1. 简单元素 没有属性,没有子元素
  2. 复杂元素 有属性或者有子元素的元素

  1. 编写xml文件
  1. 编写schema约束文件(xsd)文件
名称空间(命名空间)
我们管xsd文件叫做模式文档(约束文档),管xml文件,实例文档。
编写一个xml shcema约束文档后,通常需要将这个文件中声明的元素绑定到一个URI地址上,在xml schema技术中我们管这个过程叫做将声明的元素绑定到名称空间。以后,我们的xml文件被解析引擎解析时,可以知道我们这些xml文件中的元素来自哪里,被谁约束。

关于schema中属性

<attruibute name=”” type=”” use=””>
Name属性名称
Type 属性类型
Use 可取值有三个
Required 必须
Optional 是可选值
Prohibited 无属性值

Xml解析
Xml解析概述
所谓的xml解析就是对xml文件进行读写操作。
Xml解析方式分为两种:
  1. dom
document object model 即文档对象模型,它是w3c组织推荐的解析xml的一种方式。
  1. sax
simple api for xml 不是官方标准,它是xml 社区事实上的标准,几乎所有的xml解析器都支持它
dom与sax解析方式,它只一种理论,没有具体API.
Dom与sax解析方式区别
Dom:
  1. dom解析方式它是将整个xml文件载入内存,以树型结构来存储
  2. dom支持回写 可以对xml文件中内容进行crud操作
  3. 如果文件内容比较大,不建议使用dom解析。
Sax
  1. 相比dom,sax是一种更为轻量级解决方案
  2. 采用串行读取方式,逐行读取,读取一行解析一行。
  3. 编程比较复杂
  4. sax只能读取,不能对xml进行修改。

Xml解析包
Jaxp(sun标准)
Jdom
Dom4j(重点)

Jaxp解析
Java api for xml programming 是sun公司的一套操作xml的API.
Jaxp很好的支持了dom与sax解析方式。
Jaxp开发包是javase的一部分,它是由javax.xml org.w3c.dom oirg.xml.saq包及其子包组成

Dom解析
Dom是以层次结构组织的节点信息,在操作时,是一种树型结构,它们这些节点分为元素,属性,文本等。它们之间存在关系 parent children sibling.

Dom快速入门
步骤:

查询操作
需求:得到bookstore.xml文件中所有book的属性 category的值,并且得到book元素的子元素中的文本信息
1.得到所有的book元素可以使用 getElementsByTagName(String name),这个方法的返回值是NodelList,在NodelList中提供两个方法
2.得到book元素的属性
3.得到book下的所有子元素
getFirstChild() getLastChild()

4对子元素进行判断
getNodeType()==Node.ELEMENT
  1. 得到元素中的文本信息
getTextContent();

创建操作
在bookstore.xml文件中添加以下信息
  1. 创建元素
  1. 添加子元素
  1. 添加属性
  1. 添加文本
Dom回写操作
就是将在内存中对dom改变同步到xml文件中。
以下三步就可以完成dom回写操作
  1. 得到一个TransformerFactory对象
  2. 通过TransformerFactory得到一个Transformer对象
  3. 通过Transformer调用transform方法完成回写

修改操作
需求是将bookstore.xml文件中最后一个book元素中的
修改为 lang=”中文” 内容修改为JAVA编程思想
修改属性 setAttribute(String name,String value);
修改文本 setTextContent(String value);

删除操作
将bookstore.xml文件中最后一个book元素的属性category删除。
删除属性 removeAttribute(String name);
删除子元素 removeChild(Node childNode)
获取父元素操作
getParentNode()来完成。
Sax解析
Sax是基于事件驱动的方式来对xml进行处理。
Sax它只能进行读操作。它是读取一行解析一行。
Sax解析操作步骤:
  1. 得到一个SAXParseFactory解析器工厂
  2. 通过解析器工厂得到一个解析器对象SAXParse
  3. 通过解析器对象得到一个xml的读取器
    1. 给读取器一个时间处理器,读到了那里,我需要做什么操作,我得知道
  4. 解析xml文件

package cn.itcast.sax;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

//解析bookstore1.xml文件
public class SaxDemo {

public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException {

// 1. 得到一个SAXParseFactory解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2. 通过解析器工厂得到一个解析器对象SAXParse
SAXParser parse = factory.newSAXParser();
// 3. 通过解析器对象得到一个xml的读取器
XMLReader xmlReader = parse.getXMLReader();

// 必须组读取器设置一个事件处理器
xmlReader.setContentHandler(new DefaultHandler() {

// 开始解析整个文档
@Override
public void startDocument() throws SAXException {
System.out.println("开始解析xml文件");
}

// 开始解析某一个元素
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes) throws SAXException {

String element = ("<" + qName+" ");

if (attributes.getLength() > 0) { // 判断有属性
element += attributes.getQName(0) + "="
+ attributes.getValue(0);
}
element += ">";
System.out.println(element);
}

// 开始解析文本
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
String text = new String(ch, start, length);
if (text != null && text.trim().length() > 0) {
System.out.println("文本信息:" + text);
}

}

// 解析元素结束
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {

System.out.println("</" + qName + ">");

}

// 解析整个文档结束
@Override
public void endDocument() throws SAXException {
System.out.println("结束解析xml文件");
}
});

// 4. 解析xml文件
xmlReader.parse("WebRoot/bookstore1.xml");

}
}


DOM4J
Dom4j介绍
Dom4j是一个简单灵活开放源代码的操作xml类库。
Dom4j它是一个优秀操作xml的工具,在很开源的框架中大量使用dom4j,例如
Struts2 hibernate sping框架。
要想使用dom4j必须下载dom4j jar包才可以使用。

Dom4j快速入门
  1. 导入jar包
如果你的工程是web project 直接将jar包复制到WebRoot下的WEB-INF下的lib目录下。
如果你的工程是java project ,手动创建一个lib目录,将jar复制到目录下,右键add builder path.

  1. 编写代码
Dom4j进行CRUD操作
查询操作
需求:查询出当前的bookstore.xml文件中所有book元素,并得到book元素的所有属性category的值,并且要求得到book元素下的author子元素中的文本信息。

1.获取根元素 getRootElement()
2..获取子元素
elements() 获取所有子元素 返回是List集合
elements(String name) 获取所有指定名称子元素,返回的是List集合.
  1. 获取元素的属性值
Element.attribute(String name)得到一个Attribute对象,通过Attribute调用它的getValues()方法得到属性值,也可以简化成
Element.attributeValue(String name);来得到属性值。
  1. 获取元素下某一个指定的子元素
element(String name),返回的就是指定名称的子元素
  1. 获取元素中的文本信息
Element.getText()返回的就是元素中的文本信息

如果我们想要直接得到某一个子元素的文本信息,可以直接
Element.elementText(String name);

创建操作
需求:向bookstore.xml文件中最后一个book内添加以下内容
  1. 创建元素
DocumentHelper.createElement(String name)
返回的就是一个Element对象。
  1. 添加属性
addAttribute(String name,String )
  1. 添加文本
setText(String value)
在dom4j中可以在String与Document之间做相互转换
dom4j回写

修改操作
修改属性
addAttribute();属性不存在,执行添加,属性存在,执行修改

修改元素的文本信息
setText();

删除操作
删除属性
Element.remove(Attribute att)
参数可以通过Element.attribute(String name)来获取,完成删除操作
可以通过dom4j的API,来删除元素,但是必须通过父元素调用remove方法来删除。

我们也可以通过List集合提供的remove方法来删除。