XML

一、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 标记,
可以输入除]]>外任意字符,不能嵌套。
  1. PCDATA

​ PCDATA 的意思是被解析的字符数据(parsed character data)。

​ 可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

​ PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记.

​ 文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 >
的内置实体来分别替换它们

五、XML 解析(重点)

基本的解析方式有两种 : 一种叫 SAX,另一种叫 DOM。

区别: SAX(Simple API for XML)是基于事件流的解析, 效率高,数据量小,仅一次获取 ,

​ DOM(Document Object Model)是基于 XML 文档树结构的解析。整颗树加载到内存中,耗内存,可多次获取。

  1. DOM 解析

    在 DOM 解析中有以下四个核心的操作接口

    Document : 此接口代表了整个 XML 文档,表示的是整棵 DOM 树的根,提供了对文
    档中的数据进行访问和操作的入口,通过 Document 节点可以访问 XML 文件中所有的
    元素内容。

    Node : 此接口在整个 DOM 树种具有举足轻重的低位,DOM 操作的核心接口中有很大
    一部分接口是从 Node 接口继承过来的。例如:Document、Element 等接口,在 DOM
    树种,每一个 Node 接口代表了 DOM 树种的一个节点。

    NodeList : 此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点,
    例如:一个节点的子节点,当文档改变的时候会直接影响到 NodeList 集合。
    NamedNodeMap : 此接口表示的是一组节点和其唯一名字对应的一一对应关系,本
    接口主要用于属性节点的表示上。

    缺点: 内存消耗多,速度快,耗费时间短

  2. 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();
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值