目录
1.XML概念及基本语法
1.1XML概念
XML为可扩展标记语言,全称为Extensible Markup Language。
XML语法上和HTML比较相似,但HTML中的标签是固定的,而XML的标签是可以由用户自定义的。
1.2XML作用
【1】数据传输
【2】配置文件
2.XML语法
[1]创建普通文本文件,后缀名为xml
[2]声明
语法:<?xml version="1.0" encoding="UTF-8"?>
解析:
a、文档声明必须以<?xml开头,必须以?>结尾
b、文档声明必须在文档中的0行0列
c、文档声明的3个属性
versioin属性:指定XML文档版本.必须属性。
encoding属性:指定当前文档的编码。可选属性,默认值是utf-8;
standalone属性:指定文档独立性。可选属性,默认值为yes,表示当前文档是独立文档。如果为no表示当前文档不是独立的文档,会依赖外部文件。
[3]定义Person.xml
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p>
<id>A0001</id>
<name>zs</name>
<age>23</age>
<sex>男</sex>
</p>
<p>
<id>A0002</id>
<name>ls</name>
<age>23</age>
<sex>男</sex>
</p>
<p>
<id>A0003</id>
<name>ww</name>
<age>23</age>
<sex>男</sex>
</p>
</person>
<?xml version="1.0" encoding="UTF-8"?>
<person sex="男">
<p>
<id>A0001</id>
<name>zs</name>
<age>23</age>
</p>
<p>
<id>A0002</id>
<name>ls</name>
<age>23</age>
</p>
<p>
<id>A0003</id>
<name>ww</name>
<age>23</age>
</p>
</person>
a、普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>你好</hello>
b、元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>
c、空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合.例如:<c/>
<br/> <input/><hr/>
d、属性:
属性是元素的一部分,它必须出现在元素的开始标签中
属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
一个元素可以有0~N个属性,但一个元素中不能出现同名属性
属性名不能使用空格、冒号等特殊字符,且必须以字母开头
e、元素命名规范:
区分大小写
不能使用空格,不能使用冒号:
不建议以XML、xml、Xml开头
良好的XML文档,必须有一个根元素。
f、注释
<!-- 注释掉的内容 -->
g、转义字符
<p>5<3</p>
< 对应<小于号
>对应>大于号
& 对应&和
' 对应' 单引号
" 对应" 双引号
解析:xml中的转义字符与html中的使用方式一样,因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符
3.XML的解析
3.1什么是XML文档解析?
将xml文档中的元素、属性、文本内容进行拆解,我们获得这些组件的过程就叫做xml的解析工作。
3.2解析XML方式
[1]sax解析:逐行解析,只能查询。
[2]dom解析:一次性将文档加载到内存中,增删改查的操作都可以。
3.3dom4j解析XML案例
dom4j 必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以继续操作了。
具体步骤:
a.导入jar包
b.创建一个核心对象 SAXReader reader=new SAXReader();
c.将xml文档加载到内存中形成一棵树Document doc=reader.read(文件)
d.获取根节点 Element root=doc.getRootElement();
e.通过根节点就可以获取其他节点(文本节点,属性节点,元素节点)
获取所有的子元素List<Element> list=root.elements()
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test1 {
public static void main(String[] args) throws Exception {
/*
* 创建出来一个reader对象 阅读器
* 该阅读器用来读xml文档
*/
SAXReader reader = new SAXReader();
/*
* 此时doc对象代表的就是person.xml
* 解析doc对象就相当于是解析person.xml了
* 所以我们接下来就是对于doc对象的操作
*/
Document doc = reader.read("src/com/example/xml/person.xml");
//取得跟元素 Person
Element root = doc.getRootElement();
//查看元素的名字
/*String name = root.getName();
System.out.println(name);*/
//通过根元素取得一级子元素 p1 p2 p3
//eList p1 p2 p3
List<Element> eList = root.elements();
for(Element e:eList){
/*String ename = e.getName();
System.out.println(ename);*/
//通过一级子元素取得里面的二级子元素 每一个一级子元素下的id name age
List<Element> eeList = e.elements();
for(Element ee:eeList){
/*String eename = ee.getName();
System.out.println(eename);*/
//取得元素下的文本
String text = ee.getText();
System.out.println(text);
}
System.out.println("--------------");
}
}
}
获取指定标签
导入包:jaxen-1.1-beta-6.jar
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Test2 {
public static void main(String[] args) throws Exception {
/*
* 创建出来一个reader对象 阅读器
* 该阅读器用来读xml文档
*/
SAXReader reader = new SAXReader();
/*
* 此时doc对象代表的就是person.xml
* 解析doc对象就相当于是解析person.xml了
* 所以我们接下来就是对于doc对象的操作
*/
Document doc = reader.read("src/com/example/xml/person.xml");
//取得跟元素 Person
Element root = doc.getRootElement();
/*
* Node接口是Element接口的父接口
*
* 我们要用的是Element接口
* 但是我们现在有的是Node接口
*
* 我们要用的是儿子
* 但是我们现在有的是父亲
*
* 是一个父亲转儿子的过程
*
* 父亲:上级
* 儿子:下级
*
*/
Element e = (Element) root.selectSingleNode("//p1/name");
System.out.println(e.getText());
}
}
以上形式为xpath的形式,xpath可以实现快速的找到指定的xml元素的功能
注意:xpath的形式是传统dom4j形式的扩展形式,不能独立存在
jaxen-1.1-beta-6.jar(支持xpath的jar包)不能独立存在,必须依附于dom4j.jar才能使用
4.XML和JSON区别?
XML和JSON都可以完成不同系统之间数据交换。
XML体积较大,解析难度较大,所以在现代开发中通常采用JSON进行数据交换,因为JSON体积小,解析简单,而XML通常充当系统当中的配置文件
5.XML的约束
5.1DTD约束
DTD(Document Type Definition),文档类型定义,用来约束xml文档。规定xml文档中元素的名称,子元素的名称及顺序,元素的属性等。
<?xml version="1.0" encoding="UTF-8"?>
<!--
使用DTD文档前,必须将以下代码导入到目标文件:
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
-->
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
<!ELEMENT servlet-mapping (servlet-name,url-pattern) >
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)>
<!ATTLIST web-app version CDATA #IMPLIED>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
</web-app>
5.2 Schema约束
同DTD约束一样,也是用来约束xml文档用的技术。
从功能上讲,Schema约束要比DTD强大很多,是DTD替代者
Schema本身也是xml文档,但Schema文档的扩展名为xsd,而不是xml。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
</web-app>