一、XML
1、超文本标记语言 HTML
(1)写法格式: link
(2)关注数据的展示与用户体验
(3)标记是预定义、不可扩展的(如 表示超链接)
2、XML可扩展的标记语言
(1)写法格式:同 html 样式
(2)仅关注数据本身
(3)标记可扩展,可自定义
二、XML 作用
XML 可以用于描述数据、存储数据、传输(交换)数据。XML 现在已经成为一种通用的
数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大
的方便,用户可以定义自己需要的标记
1、 存储、交换数据
XML 只用元素和属性来描述数据,而不提供数据的显示方法,这使得 XML 具有能够运
行于不同系统平台之间和转换成不同格式目标文件。用 XML 在应用程序和公司之间
作数据交换,几个应用程序可以共享和解析同一个 XML 文件,不必使用传统的字符串
解析或拆解过程。
2、配置
使用 XML 配置文件的应用程序能够方便地处理所需数据,不用像其它应用那样要经过重新编译才能修改和维护应用系统。xml 比 数据库占用的资源少,操作方便,用来存储简单的信息,现在主要用在程序的配置文件上(比如 web.xml)。
三、XML 示例
1、方式 1
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person>
<name>白晶晶</name>
<age>28</age>
</person>
<person>
<name>至尊宝</name>
<age>300</age>
</person>
</people>
2、方式 2
<?xml version="1.0" encoding="UTF-8"?>
<people>
<person name="白晶晶" age="28"></person>
<person name="至尊宝" age="300"></person>
</people>
解析<?xml version="1.0" encoding="UTF-8"?>
<?:XML声明的开始字符
xml:表示当前是xml文件
version:xml的版本;目前只有1.0,国际标准
standalone:表示xml文件是否独立;
如果值是"yes",表示xml是独立存在的,不能引入外部的规范文件;
如果值是"no",表示xml不是独立存在的,可以引入外部的规范文件;
默认是"yes"
encoding:指定文件的所使用的字符编码;默认"utf-8"
?>:XML声明的结束字符
注意文本文件保存时候默认的编码格式是ANSI,需用记事本把它手动改为UTF-8保存。
a、语法规范:
1)、需要有版本声明
2)、必须有且仅有一个根元素
3)、严格区分大小写
4)、属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次
5)、标记成对;
6)、空标记关闭;
7)、元素正确嵌套。
b、元素命名规则
1)、名称中可以包含字母、数字或者其他可见字符;
2)、名称不能以数字开头;
3)、不能以 XML/xml/Xml…开头;
4)、名称中不能含空格;
5)、名称中不能含冒号(注:冒号留给命名空间使用)
c、实体
1)内置的 5 种实体
实体 符号
& lt; <
& gt; >
& amp; &
&qout; "
& apos; ’
2)自定义实体
]>
使用已定义的实体:&实体名;
d、文档类型声明
文档类型定义——DOCTYPE,文档类型声明,紧跟 XML 声明之后,包含所有实体声明
四、组成
元素
属性
实体
PCDATA:是被解析的字符数据(parsed character data)。
CDATA:用于把整段文本解释为纯字符数据而不是标记的情况。如包含大量的<、>、&、或者"字符。
CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记, 可以输 入除]]>外任意字符,不能嵌套。
语法:<![CDATA[ ...... ]]>
<!-- 定义实体 -->
<!DOCTYPE shsxt[
<!--实体声明 -->
<!ENTITY uname "admin">
<!ENTITY gender "男">
]>
<!-- 根元素 -->
<shsxt>
<teacher>Hello
<!-- 标签成对出现 ,属性值用引号-->
<name age="18">Lisa</name>
<gender>女</gender>
</teacher>
<teacher age="19">
<name>李四</name>
<gender>男</gender>
</teacher>
<!-- 使用实体 -->
<teacher>
<name>&uname;</name>
<gender>&gender;</gender>
</teacher>
<!-- CDATA -->
<desc><![CDATA[战国时期,芈月是楚威王最宠爱的小公主,但<desc>在楚威王
死后生活一落千丈,母亲向氏被楚威后逐出宫,芈月和弟弟芈戎躲过了一次次灾难和危机。
芈月与楚公子黄歇青梅竹马,真心相爱,但被作为嫡公主芈姝的陪嫁媵侍远嫁秦国。芈姝当
上了秦国的王后,芈月不得已成为宠妃...]]>
</desc>
</shsxt>
注:CDATA 节中的所有字符都会被当做元素字符数据的常量部分,而不是 XML 标记,
可以输入除]]>外任意字符,不能嵌套。
- PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记.
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 >
的内置实体来分别替换它们
五、XML 解析(重点)
基本的解析方式有两种 : 一种叫 SAX,另一种叫 DOM。
区别: SAX(Simple API for XML)是基于事件流的解析, 效率高,数据量小,仅一次获取 ,
DOM(Document Object Model)是基于 XML 文档树结构的解析。整颗树加载到内存中,耗内存,可多次获取。
-
DOM 解析
在 DOM 解析中有以下四个核心的操作接口
Document : 此接口代表了整个 XML 文档,表示的是整棵 DOM 树的根,提供了对文
档中的数据进行访问和操作的入口,通过 Document 节点可以访问 XML 文件中所有的
元素内容。Node : 此接口在整个 DOM 树种具有举足轻重的低位,DOM 操作的核心接口中有很大
一部分接口是从 Node 接口继承过来的。例如:Document、Element 等接口,在 DOM
树种,每一个 Node 接口代表了 DOM 树种的一个节点。NodeList : 此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点,
例如:一个节点的子节点,当文档改变的时候会直接影响到 NodeList 集合。
NamedNodeMap : 此接口表示的是一组节点和其唯一名字对应的一一对应关系,本
接口主要用于属性节点的表示上。缺点: 内存消耗多,速度快,耗费时间短
-
DOM 解析过程
① 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); ②建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder(); ③建立 Document : Document doc = builder.parse(“要解析的文件路径”); ④建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”); ⑤进行 XML 信息读取
DOM 操作除了可以进行解析外,也可以进行文档的生成
如果想要生成 XML 文件,则在创建文档的时候,就应该使用 newDocument()方法
如果要将 DOM 的文档输出,本身是比较麻烦的 。一次编写多次 copy
2、SAX 解析
SAX(Simple API for XML)解析是按照 xml 文件的顺序一步一步的来解析。与 DOM 操作不同的是,SAX 采用的是一种顺序的模式进行访问,是一种快速读取 XML 数据的方式。当使用 SAX 解析器进行操作的时候会触发一系列的事情,当扫描到文档(document)开始与结束、元素(element)开始与结束时都会调用相关的处理方法,
如果要想实现这种 SAX 解析,则肯定首先建立一个 SAX 的解析器
// 1、创建解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2、获得解析器
SAXParser parser = factory.newSAXParser();
// SAX解析器 ,继承 DefaultHandler
String path = new File("resource/demo01.xml").getAbsolutePath();
// 解析
parser.parse(path, new MySaxHandler());
缺点: 每次从上往下只会取所需的,数量较少所以消耗较少,因为每次都要进行解析.所以耗时长.
走完上面的值就不能拿到下面的值,还有只能进行查询不能进行更改.
3、DOM4j 解析 (重点)
dom4j 是一个简单的开源库,用于处理 XML、 XPath 和 XSLT,它基于 Java 平台,使用 Java 的集合框架,全面集成了 DOM,SAX 和 JAXP。下载路径http://www.dom4j.org/dom4j-1.6.1/
源码: http://sourceforge.net/projects/dom4j.
作用: 可以使用 DOM4J 进行 XML 文件的读、写操作
Dom4j解析步骤:
1、得到要解析的文件file对象
2、得到读取器 SaxReader
3、通过读取器 SaxReader得到Document对象
4、得到Document对象的根节点
5、得到根节点的所有子节点
6、迭代所有的子节点,得到对应结果
public class Dom4jDemo {
@SuppressWarnings("unchecked") // 抑制警告
public static void main(String[] args) throws Exception {
// 1、得到要解析的文件file对象
File file = new File("src/test.xml");
// 2、得到读取器 SaxReader
SAXReader reader = new SAXReader();
// 3、通过读取器 SaxReader得到Document对象
Document document = reader.read(file);
// 4、得到Document对象的根节点
Element element = document.getRootElement();
// 打印根节点
System.out.println(element.getName());
// 5、得到根节点的所有子节点
Iterator<Element> iterator = element.elementIterator();
// 6、迭代所有的子节点,得到对应结果
while(iterator.hasNext()) {
// 得到每一个子节点
Element e = iterator.next();
//System.out.println(e.getName() + "====" + e.getStringValue());//取根目录中的纯文本,包扩文本节点.
//System.out.println(e.getName() + "====" + e.getText());// 取根目录中的文本节点
String name = e.elementText("name");
System.out.println(name + " = " + e.elementText("gender") );
}
}
}
创建
public class Dom4jWriter {
public static void main(String[] args) throws Exception {
// 使用DocumentHelper来创建 Document对象
Document document = DocumentHelper.createDocument();
// 创建元素并设置关系
Element person = document.addElement("person");
Element name = person.addElement("name");
Element age = person.addElement("age");
// 设置文本
name.setText("shsxt");
age.setText("10");
// 创建格式化输出器
OutputFormat of = OutputFormat.createPrettyPrint();
of.setEncoding("utf-8");
// 输出到文件
File file = new File("src/outputdom4j.xml");
XMLWriter writer = new XMLWriter(new FileOutputStream(new
File(file.getAbsolutePath())),of);
// 写出
writer.write(document);
writer.flush();
writer.close();
}
}