xml笔记

1.XML 与 HTML 的主要差异
xml标签都是自定义的,html标签是预定义。
xml的语法严格,html语法松散。
xml是存储数据的,html是展示数据。
2.xml的作用
存放数据

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="p001">
<name>张三</name>
</person>
<person id="p002">
<name>李四</name>
</person>
</persons>

类似于java代码

class Person{
String id;
String name;
}
public void test(){
HashSet<Person> persons = new HashSet<Person>();
persons.add( new Person("p001","张三") );
persons.add( new Person("p002","李四") );
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean className="com.itheima_00_Bean.User">
<property name="username" value="jack"></property>
</bean>
</beans>

类似于java代码

class Bean{
private String username;
private String pws;
//补全set\get方法
}
import com.itheima_00_Bean.User;
public static void main(){
Class clzzz = Class.forName("com.itheima_00_Bean.User");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("setUsername",String.class);
method.invoke(obj,"jack");
}

3.在idea中配置xml模板
xml的学习笔记_解析器
4.xml的组成元素
文档声明
XML文档声明格式:

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

注意: 文档声明必须为<?xml开头,以?>结束;
文档声明必须从文档的0行0列位置开始;
文档声明只有2个属性:versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
encoding:指定当前文档的编码。可选属性,默认值是utf-8;
元素
元素 element

*元素是XML文档中最重要的组成部分,
普通元素的结构开始标签、元素体、结束标签组成。例如:大家好
元素体:元素体可以是元素,也可以是文本,例如:你好
空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:
元素命名:*区分大小写
不能使用空格,不能使用冒号:
不建议以XML、xml、Xml开头
格式化良好的XML文档,必须只有一个根元素。
属性
属性 attribute
<beanid="" className="">
属性是元素的一部分,它必须出现在元素的开始标签中
属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
一个元素可以有0~N个属性,但一个元素中不能出现同名属性
属性名不能使用空格、冒号等特殊字符,且必须以字母开头

注释
XML的注释,以“”结束。注释内容会被XML解析器忽略!
转义字符
因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例
如:“<”、“>”、“’”、“””、“&”。
xml的学习笔记_xml_02
CDATA可以原样显示,CD提示,[]内可以写任意内容

<![CDATA[5 < 8]]>

5.xml约束
DTA约束
DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的
名称及顺序,元素的属性等。
开发中,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文
档。常见框架使用DTD约束有:struts2、hibernate等。

通过提供的DTD“bean.dtd”编写XML

<?xml version="1.0" encoding="UTF-8"?>
<!--
传智播客DTD教学实例文档。
模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
格式如下:
<!DOCTYPE beans SYSTEM "bean.dtd">
-->
<!ELEMENT beans (bean*,import*) >解释:benas里面能有bean和import两个子标签,*表示子标签可以有多个,逗号表示前后顺序,bean必须在import前面
<!ELEMENT bean (property*)>
<!ELEMENT property (#PCDATA)>解释:PCDATA表示字符串文本,即该标签中可以有文本
<!ELEMENT import (#PCDATA)>
<!ATTLIST bean id CDATA #REQUIRED
className CDATA #REQUIRED
>解释:ATT指的是属性,#REQUIRED表示这个属性是必须的,CDATA表示属性可以是字符串。如果是#IMPLIED表示非必须,可写可不写。
<!ATTLIST property name CDATA #REQUIRED
value CDATA #REQUIRED
>
<!ATTLIST import resource CDATA #REQUIRED>

完成xml内容编写

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
<bean id="" className=""></bean>
<bean id="" className="">
<property name="" value=""></property>
<property name="" value=""></property>
</bean>
<import resource=""></import>
<import resource=""></import>
</beans>

Schema约束
Schema是新的XML文档约束; Schema要比DTD强大很多,是DTD 替代者; Schema本身也是XML文档,但
Schema文档的扩展名为xsd,而不是xml。 Schema 功能更强大,数据类型更完善 Schema 支持名称空间
与DTD一样,要求可以通过schema约束文档编写xml文档。常见框架使用schema的有:Spring等

通过提供“bean-schema.xsd”编写xml文档

<?xml version="1.0" encoding="UTF-8"?>
<!--
传智播客Schema教学实例文档。
模拟spring规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:
<beans xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
>
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/bean"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.itcast.cn/bean"
elementFormDefault="qualified">
<!-- 声明根标签 -->
l 案例文档中同一个“命名空间”分别使用“默认命名空间”和“显示命名空间”进行引入,所以文档中和xsd:schem
a作用一样。
案例实现
完成xml内容编写
<element name="beans">
<complexType>
<choice minOccurs="0" maxOccurs="unbounded">
<element name="bean">
<complexType>
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="property">
<complexType>
<attribute name="name" use="required"></attribute>
<attribute name="value" use="required"></attribute>
</complexType>
</element>
</sequence>
<attribute name="id" use="required"></attribute>
<attribute name="className" use="required"></attribute>
</complexType>
</element>
<element name="import">
<complexType>
<attribute name="resource" use="required"></attribute>
</complexType>
</element>
</choice>
</complexType>
</element>
</schema>

完成xml内容编写

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.itcast.cn/bean"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
>
<bean id="" className=""></bean>
<bean id="" className="">
<property name="" value=""/>
<property name="" value=""/>
</bean>
<import resource=""/>
<import resource=""/>
</beans>

约束头解析
xml的学习笔记_xml_03
6.xml解析
当将数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用Java基础所学习的IO知识是可以完成
的,不过你需要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。人们为不同问题提供不同
的解析方式,并提交对应的解析器,方便开发人员操作XML。
开发中比较常见的解析方式有三种,如下:
DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
缺点:XML文档过大,可能出现内存溢出显现。

XML DOM 将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可
以对DOM进行操作。
xml的学习笔记_解析器_04
xml的学习笔记_属性值_05
SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体
解析,每执行一行,都将触发对应的事件。(了解)
优点:处理速度快,可以处理大文件
缺点:只能读,逐行后将释放资源。
PULL:Android内置的XML解析方式,类似SAX。(了解)
解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供
易于操作的解析开发包。
xml的学习笔记_属性值_06
常见的解析开发包:
JAXP:sun公司提供支持DOM和SAX开发包
JDom:dom4j兄弟
jsoup:一种处理HTML特定解析开发包
dom4j:比较常用的解析开发包,hibernate底层采用。
7.dom4j工具包的使用
DOM4J是一个Java的XML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom
技术,如今可以看到越来越多的Java软件都在使用DOM4J来读写XML。
如果想要使用DOM4J,需要引入支持xpath的jar包 dom4j-1.6.1.jar
DOM4J必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就
可以操作了。
常用API如下:
SaxReader对象
read(…) 加载执行xml文档
Document对象
getRootElement() 获得根元素
Element对象
elements(…) 获得指定名称的所有子元素。可以不指定名称
element(…) 获得指定名称第一个子元素。可以不指定名称
getName() 获得当前元素的元素名
attributeValue(…) 获得指定属性名的属性值
elementText(…) 获得指定名称子元素的文本值
getText() 获得当前元素的文本内容
API案例实现
编写xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="001" className="cn.itcast.demo.User">
		<property name="user" value="jacl"></property>
		<property name="user" value="rose"></property>
	</bean>
	
	<bean id="002" className="cn.itcast.demo.Admin">
		<property name="user" value="admin"></property>
		<property name="user" value="write"></property>
	</bean>
</beans>

编写解析xml代码

public static void main(String[] args) throws Exception {
	SAXReader sax = new SAXReader();
	Document document = sax.read("beans.xml");//返回Document(理解为是js document)
	
	Element elemRoot = document.getRootElement();
	List<Element>list = elemRoot.elements();//返回的是List集合,需要手动转换成Element类型,以便调用Element的方法
	
	for(Element element : list){
		String id =element.attributeValue("id");
		String className = element.attributeValue("className");
		System.out.println(id+""+className);
		
		List<Element>listElem = element.elements();
		for(Element elem : listElem){
			String name = elem.attributeValue("name");
			String value = elem.attributeValue("value");
			System.out.println(name+""+value);
		}
	}
}

8.XPath解析XML
XPath 是一门在 XML、html 文档中查找信息的语言。
XPath 是一个 W3C 标准,可通过W3CSchool文档查阅语法。
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接
获取到某个元素。
使用dom4j支持xpath具体操作
默认的情况下,dom4j不支持xpath,如果想要在dom4j里面使用xpath,需要引入支持xpath的jar包 jaxen-
1.1.6.jar
在dom4j里面提供了两个方法,用来支持xpath
List selectNodes(“xpath表达式”),用来获取多个节点
Node selectSingleNode(“xpath表达式”),用来获取一个节点
使用步骤:
导入jaxen.jar包
导入核心类和dom4j一样
使用字符串标识,获取标签
xpath表达式常用查询形式
/AAA/DDD/BBB: 表示一层一层的,AAA下面 DDD下面的BBB
//BBB: 表示和这个名称相同,表示只要名称是BBB 都得到
/*: 所有元素
BBB[1]:表示第一个BBB元素
BBB[last()]:表示最后一个BBB元素
//BBB[@id]: 表示只要BBB元素上面有id属性 都得到
//BBB[@id=‘b1’] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1

案例实现
编写xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<students>
	<student number="heima_0001">
		<name id="itcast">
			<xing></xing>
			<ming></ming>
		</name>
		<age>18</age>
		<sex>male</sex>
	</student>
	<student number="heima_0002">
		<name>jack</name>
		<age>18</age>
		<sex>female</sex>
	</student>
</students>

编写xpath代码解析xml文件

import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
/**
*XPath查询
*/
public class Demo4jXpath {
	public static void main(String[] args) throws Exception {
		SAXReader saxReader=new SAXReader();
		String path = Demo4jXpath.class.getClassLoader().getResource("student.xml").getFile();
		File file = new File(path);
		Document document=saxReader.read(file);
		
		//4.结合xpath语法查询
		//4.1查询所有student标签
		List<Node> nodes = document.selectNodes("//student");
		for (Node node : nodes) {
			System.out.println(node);
		}
		
		System.out.println("--------------------");
		
		//4.2查询所有student标签下的name标签
		nodes = document.selectNodes("//student/name");
		for (Node node : nodes) {
			System.out.println(node);
		}
		
		System.out.println("--------------------");
		
		//4.3查询student标签下带有id属性的name标签
		nodes = document.selectNodes("//student/name[@id]");
		for (Node node : nodes) {
			System.out.println(node);
		}
		System.out.println("--------------------");
		//4.4查询student标签下带有id属性的name标签 并且id属性值为itcast
		
		nodes = document.selectNodes("//student/name[@id='itcast']");
		for (Node node : nodes) {
			System.out.println(node);
		}
	}
}