04 XML

…衆ロ難τιáo~ 提交于 2020-01-29 04:48:11

1. xml

1.1 作用

  1. 保存数据
  2. 配置文件
  3. 数据传输的载体

1.2 定义

<!--version表示声明用什么版本解释器去执行,encoding用什么编码,standalone是no代表有依赖别文档-->
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<stu id="10086">
	<name>liyang</name>
    <age>18</age>
</stu>

1.3 编码问题

我们本地电脑上的文件编码是GBK。这就去代表着我们写完文件后,文件是以GBK编码的形式存储在电脑上的,如果这里我们指定我们的XML文件的编码是UTF8就肯定会出现乱码问题了。要想不出现乱码问题,就需要把我们的XML文件的编码改成和我们本地电脑上的编码一致。为了通用建议使用UTF-8

1.4 元素定义

  1. 文档声明下的第一个元素叫做根元素(根标签)
  2. 标签一般成对出现。但是也有例外,即空标签,一般配合属性一起使用

1.5 注释

<!-- -->

1.6 非法字符

< 和 & 是非法字符
< <!-- 这是<的意思 -->
& <!-- 这是&的意思 -->

1.7 CDATA区

不想让xml去解析的内容可以用CDATA去括住

<![CDATA[  这里面的东西是不解析的哦!! ]]>
<![CDATA[]]>

1.8 解析

DOM:Document Object Model。把整个xml加载到内存中形成树状结构。整个文档称之为document对象,属性对应Attribute对象,所有的元素节点对应Element对象,文本对应Text对象,以上所有的对象都可以称之为Node节点。可以对文档进行增删改查操作,但是文档特别大将会造成内存溢出。

SAX:Simple API for Xml 基于事件驱动,读取一行,解析一行。不会造成内存溢出,但是也不能进行增删,只能进行查阅。

// 导包:dom4j-1.6.1.jar
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class HelloWorld {

	public static void main(String[] args) throws Exception {
		// 1. 创建sax读取对象
		SAXReader reader = new SAXReader();
		// 2. 读取
		Document document = reader.read("src/Test.xml");
		// 3. 获取根元素
		Element rootElement = document.getRootElement();
		// 4. 获取根元素下面的元素
		List<Element> elements = rootElement.elements();
		// 5. 遍历下面的元素,然后拿出中的元素值
		for (Element element : elements) {
			// 6. 获取name 和 age
			String name = element.element("name").getText();
			String age = element.element("age").getText();
			System.out.println(name + age);
		}

	}

}
// 先要导包:jaxen-1.1.1.jar
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class HelloWorld {

	public static void main(String[] args) throws Exception {
		// 1. 创建sax读取对象
		SAXReader reader = new SAXReader();
		// 2. 读取
		Document document = reader.read("src/Test.xml");
		// 3. 获取根元素
		Element rootElement = document.getRootElement();
		// 4. 使用Xpath去获取元素
        /*
		 * 一级一级寻找路径:/stus/stu/name
		 * 寻找全部的name路径://name
		 * 标签是name且属性是id=1的://name[@id='1']
		 */
		List<Element> names = rootElement.selectNodes("//name");
		// 5. 遍历
		for (Element element : names) {
			System.out.println(element.getText());
		}

	}

}

1.9 约束

1.9.1 DTD方式

<?xml version="1.0" encoding="UTF-8"?>

<!-- 

网络 
<!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd">
本地
<!DOCTYPE stus SYSTEM "stus.dtd">
内嵌
<!DOCTYPE stus [
	<!ELEMENT stus (stu)>
	<!ELEMENT stu (name,age)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT age (#PCDATA)>
]>

-->

<!DOCTYPE stus [
	<!ELEMENT stus (stu)>
	<!ELEMENT stu (name,age)>
	<!ELEMENT name (#PCDATA)>
	<!ELEMENT age (#PCDATA)>
]>

<stus>
	<stu>
		<name>李阳</name>
		<age>18</age>
	</stu>
</stus>

1.9.2 Schema方式

在这里插入图片描述
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!