Java基础54XML XML DTD DOM4J解析

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">&lt;</child>
     <!-- 6.标签没有内嵌内容可以精简 -->
     <child name="小莫" age="18" />
     <!-- 7.转义符   &lt;	<	小于-->
     <child>&lt;</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">&lt;</child>
	<!-- 6.标签没有内嵌内容可以精简,自闭标签 -->
	<child name="小莫" age="18" />
	<!-- 7.转义符 &lt; < 小于 -->
	<child>&lt;</child>
	<!-- 8.XML对于大小写敏感,必须使用相同的大小写开标签和闭标签 -->
	<Form>FORT</Form>
</root>
<!-- <root1></root2> 3.这段是多个根标签,所以会报错 -->

实体引用

在 XML 中,一些字符拥有特殊的意义。(转义符)
如果你把字符 “<” 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。

如果想使用那些符号,使用转义符
&lt;	<	小于
&gt;	>	大于
&amp;	&	和号
&apos;	'	单引号
&quot;	"	引号


	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() + ">");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值