1.XML
XML 是什么? |
---|
是指可扩展标记语言(EXtensible Markup Language) |
是一种标记语言,很类似 HTML |
设计宗旨是传输数据,而非显示数据 |
标签没有被预定义。您需要自行定义标签。(可以自定义标签) |
被设计为具有自我描述性。 |
是 W3C (是Web技术领域最具权威和影响力的国际中立性技术标准机构)的推荐标准 |
之前学习的对象流的序列化,是java API提供的一个序列化方案之一,而XML就类似序列化的方案之一。
而且序列化就是为了程序与程序之间的交互(将对象方便传输)
XML 仅仅是纯文本 |
---|
XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。 |
不过,能够读懂 XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于应用程序的特性。 |
XML 无所不在 |
---|
当我们看到 XML 标准突飞猛进的开发进度,以及大批的软件开发商采用这个标准的日新月异的速度时,真的是不禁感叹这真是令人叹为观止。 |
目前,XML 在 Web 中起到的作用不会亚于一直作为 Web 基石的 HTML。 |
XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。 |
XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。
XML 使用简单的具有自我描述性的语法:
XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集)
<?xml version="1.0" encoding="ISO-8859-1"?>
根元素:XML 文档必须包含根元素。该元素是所有其他元素的父元素。
<note>
所有 XML 元素有开标签,也必须有关闭标签
<to>George</to>
XML 标签对大小写敏感,必须使用相同的大小写来编写打开标签和关闭标签:
<from>John</from>
所有元素都必须彼此正确地嵌套:
<heading>Reminder</heading>
XML 也可拥有属性(名称/值的对--id="s101"),XML 的属性值须加引号。
<body id="s101">Don't forget the meeting!</body>
</note>
xml.file:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 必须置顶,版本,和编码 -->
<!-- XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集) -->
<!-- 根元素:XML 文档必须包含根元素。该元素是所有其他元素的父元素。只能有一个 -->
<note>
<!-- 子元素 -->
<!-- 所有 XML 元素有开标签,也必须有关闭标签 -->
<to>George</to>
<!-- XML 标签对大小写敏感,必须使用相同的大小写来编写打开标签和关闭标签: -->
<from>John</from>
<!-- 所有元素都必须彼此正确地嵌套:标签里面可以有标签,层级没有限制 -->
<heading>
Reminder
<aaa></aaa>
<bbb></bbb>
</heading>
<!-- XML 也可拥有属性(名称/值的对--id="s101"),XML 的属性值须加引号。 -->
<body id="s101">Don't forget the meeting!</body>
<!-- 自闭标签:自己关闭的,没有内容,只能有属性 -->
<sss id="sdfff" />
</note>
一个 XML 文档实例
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1.XML 声明。它定义 XML 的版本 (1.0) 和
所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集) 注释不要占用声明头-->
<!-- 2.根标签:根元素:XML 文档必须包含根元素。该元素是所有其他元素的父元素。xml里面,根标签只能一个
,注意root标签里面 <root>部分称为开标签 </root>称之为闭标签
开标签和闭标签名字一致
-->
<root>
<!-- 4.标签里面可以内嵌标签&&可以内嵌内容 -->
<child>子标签</child>
<!-- 5.标签里面可以拥有属性 -->
<child name="张三" age="18"><</child>
<!-- 6.标签没有内嵌内容可以精简 -->
<child name="小莫" age="18" />
<!-- 7.转义符 < < 小于-->
<child><</child>
<!-- 8.XML对于大小写敏感,必须使用相同的大小写开标签和闭标签 -->
<Form>FORT</Form>
</root>
<!-- <root1></root2> 3.这段是多个根标签,所以会报错 -->
xml.file:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1.XML 声明。它定义 XML 的版本 (1.0) 和 所使用的编码 (ISO-8859-1 = Latin-1/西欧字符集) 注释不要占用声明头 -->
<!-- 标签可以自定义,随便起名 -->
<!-- 2.根标签:根元素:XML 文档必须包含根元素。该元素是所有其他元素的父元素。xml里面,根标签只能一个 ,注意root标签里面 <root>部分称为开标签
</root>称之为闭标签 开标签和闭标签名字一致 -->
<root>
<!-- 4.标签里面可以内嵌标签&&可以内嵌内容 -->
<child>子标签</child>
<!-- 5.标签里面可以拥有属性,转义符 -->
<child name="张三" age="18"><</child>
<!-- 6.标签没有内嵌内容可以精简,自闭标签 -->
<child name="小莫" age="18" />
<!-- 7.转义符 < < 小于 -->
<child><</child>
<!-- 8.XML对于大小写敏感,必须使用相同的大小写开标签和闭标签 -->
<Form>FORT</Form>
</root>
<!-- <root1></root2> 3.这段是多个根标签,所以会报错 -->
实体引用
在 XML 中,一些字符拥有特殊的意义。(转义符)
如果你把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
如果想使用那些符号,使用转义符
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
XML 命名规则
XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
可使用任何名称,没有保留的字词。
练习:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 根据xml语法,定义一个饮食店铺的菜单 -->
<!-- 肯定会有一个根元素 -->
<menus>
<!-- 店铺不只有一个产品、菜品(青菜炒青菜、咸鱼茄子锅)、饮品(奶茶配奶茶、咖啡) -->
<chanpin>
<!-- 看成一个对象,对象中肯定会有不同的属性 -->
<name>芹菜炒青菜</name>
<price>20</price>
<type>菜品</type>
</chanpin>
<chanpin>
<name>咸鱼茄子锅</name>
<price>50</price>
<type>菜品</type>
</chanpin>
<chanpin>
<name>奶茶配奶茶</name>
<price>15</price>
<type>饮品</type>
</chanpin>
<chanpin>
<name>咖啡</name>
<price>15</price>
<type>饮品</type>
</chanpin>
</menus>
XML语法验证(不一定需要掌握)
XML DTD
DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构
XML Schema
W3C 支持一种基于 XML 的 DTD 代替者,它名为 XML Schema
2.XML DTD
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
它使用一系列的合法元素来定义文档结构。
xml.file:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
导入dtd:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
note.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
3.XML解析
XML的解析方式分为四种:1、DOM解析;2、SAX解析;3、JDOM解析;4、DOM4J解析。
一、DOM解析
DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。
DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的。
优点:
1、形成了树结构,有助于更好的理解、掌握,且代码容易编写。
2、解析过程中,树结构保存在内存中,方便修改。
缺点:
1、由于文件是一次性读取,所以对内存的耗费比较大。
2、如果XML文件比较大,容易影响解析性能且可能会造成内存溢出。
二、SAX解析
SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
优点:
1、采用事件驱动模式,对内存耗费比较小。
2、适用于只处理XML文件中的数据时。
缺点:
1、编码比较麻烦。
2、很难同时访问XML文件中的多处不同数据。
三、JDOM解析
JDOM方法是根据DOM方法的众多繁琐操作进行包装得到的,上面我们看到,DOM方法解析XML文档其实是很繁琐的,而且很混乱,标签、属性、换行空格都当作结点类型来处理。JDOM方法定义了一系列通俗、好记的方法来解析XML,方法的底层封装了一系列DOM操作,但是我们不必亲自去进行这些繁琐的工作了。
优点:
a、DOM方式的优点:查找方便,可以修改
缺点
a、DOM方式的缺点:装载整个文档,对内存容量要求高
四、DOM4J解析
是JDOM的扩展,里面集合了sax和dom的优点。
连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
使用d4j解析menus:
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test1 {
// 使用dom4j,dom4j是第三方插件(不属于jdk中的内容),要使用dom4j就要添加相关的依赖包
// java 的依赖包,都是使用.jar作为后缀,普通项目jar包一般放在lib目录下(图书馆)
// 把依赖包拖到lib文件夹后,jar还要添加到项目中才能使用
// 添加完成后就可以使用了
public static void main(String[] args) throws DocumentException {
// 析xml文件
File file = new File("menu.xml");// 相对路径是项目的路径
SAXReader reader = new SAXReader();
// 文档内容 就是整个xml的所有标签的内容
Document document = reader.read(file);
// get 获取 root根 Element元素
Element element = document.getRootElement();
// 先输出跟标签
System.out.println("<" + element.getName() + ">");
// document2拿到的就是子元素的内容
List<Element> list = element.elements();
for (Element object : list) {
System.out.println("<" + object.getName() + ">");
List<Element> list2 = object.elements();// 下一级的子元素
for (Element object2 : list2) {
System.out.print("<" + object2.getName() + ">");
System.out.print(object2.getText());
System.out.print("</" + object2.getName() + ">");
}
System.out.println("</" + object.getName() + ">");
}
System.out.println("</" + element.getName() + ">");
}
}