1.什么是xml
Xml是一种标记语言,没有固定的标签,被用于信息的记录和传递,全称为可拓展性标记语言。
2.语法:
必须声明,用于描述xml的版本和编码方式,Xml有且只有一个根元素,Xml对大小写敏感,标签成对出现,且要正确嵌套,不能交叉,属性值要使用双引号
如
<?xml version="1.0" encoding="UTF-8"?> //xml声明版本与编码信息 <dependencies>//根元素 <dependency> <!-- <label for="exampleInputEmail1"> 其中的for属于属性--> //注释 <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version>//元素,元素由开始标签,内容,结束标签组成 </dependency> </dependencies>
备注:
xmlns=http://java.sun.com/xml/ns/javaee //默认命名空间,使得该标签本省以及他的所有子元素都属于这个名称空间,避免文档中产生的命名冲突,使得元素和属性名在整个系统中是唯一的,同时也限定了这些元素的作用范围,子标签中的属性不属于该名称空间,命名空间的处理方式与处理属性的方式不同,
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" //xsi前缀开头的名称空间,很多时候它并没有包括任何的元素,例如<person xmlns:hr=”www.wwww.www”> </person>,倘若需要关联起来,那么在标签前需要使用相应的前缀。例如<hr:person xmlns:hr=”www.wwww.www”> </hr:person>,假如需要属性也属于该名称空间,那么在属性前加hr:前缀;假如元素属于一个名称空间,那么他的属性也会被唯一标识,没必要为属性指定命名空间。
xsi:schemaLocation=http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd //前部分是targetnamespace,后半部分是文件保存的文件路径加文件名,用于约束书写的格式,xsd属于约束文件,xsd是dtd替代者,dtd不可扩展,不支持命名空间,只提供非常有限的数据类型,xsd可扩展,持数据类型,支持命名空间,xml书写;Xml schema xml工作原理是基于名称空间指定数据格式和数据类型。
名称空间的作用域:该标签和子元素;
3.自定义dtd标签语法:
1)<!DOCTYPE 根元素[元素声明]>
2)<!ELEMENT 元素名(子元素[, 子元素...])>//约束元素的嵌套层级
3)<!ELEMENT 标签名字 标签类型>//约束元素体里面的数据
/*
PCDATA (#PCDATA) 被解释的字符串数据
EMPTY EMPTY 即空元素,例如<hr/>
ANY ANY 即任意类型
例如:
<!ELEMENT 书名 (#PCDATA)> <!‐‐"书名"元素体为字符串数据‐‐>
<!ELEMENT 作者 (#PCDATA)> <!‐‐"作者"元素体为字符串数据‐‐>
<!ELEMENT 售价 (#PCDATA)> <!‐‐"售价"元素体为字符串数据‐‐>
<!ELEMENT 出版日期 ANY> <!‐‐"出版日期"元素体为任意类型‐‐>
<!ELEMENT 版本号 EMPTY> <!‐‐"版本号"元素体为空元素‐‐>
*/
/*数量词符号含义
* 表示元素可以出现0到多个
+ 表示元素可以出现至少1个
? 表示元素可以是0或1个
, 表示元素需要按照顺序显示
| 表示元素需要选择其中的某一个*/
4)<!ATTLIST 标签名称
属性名称1 属性类型1 属性说明1
属性名称2 属性类型2 属性说明2
…
>
/*
CDATA 代表属性是文本字符串
ID 代码该属性值唯一,不能以数字开头
ENUMERATED代表属性值在指定范围内进行枚举
*/
/*
#REQUIRED 代表属性是必须有的
#IMPLIED 代表属性可有可无
#FIXED 代表属性为固定值
*/
<!DOCTYPE scores SYSTEM "dtd名称"> //<!-- 引入外部DTD文件-->
4.Xml解析
1)可使用的方法
Dom解析(java官方建议),sax解析,jdom解析,第三方dom4j解析
备注:
DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象
a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
b)缺点:XML文档过大,可能出现内存溢出
SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都触发对应的事件。
2)dom4j解析实例
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6</version> </dependency> public class TestXml { public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader();// 创建SAXReader对象, 用于读取xml文件 Document doc = reader.read(new File("src/scores2.xml"));// 读取xml文件, 得到Document对象 Element root = doc.getRootElement();// 获取根元素 Iterator<?> it = root.elementIterator();//获取根元素下所有子元素 while(it.hasNext()) { // 取出元素 Element e = (Element) it.next(); Attribute id = e.attribute("id");// 获取id属性值,id可以写任意的属性名 Element name = e.element("name"); // 获取指定名称第一个子元素 } } }
备注:
a)dom解析的原理
XML DOM 和 HTML DOM一样,XML DOM 将整个XML文档加载到内存,生成一个DOM树(按照xml的层次结构),并获得一个Document对象,通过Document对象就可以对DOM进行操作。
b)其他方法
String getName() 获得当前元素的元素名
String elementText(Sting ele) 获得指定名称子元素的文本值
String getText() 获得当前元素的文本内容
c)Dom4J结合XPath解析XML:
XPath 使用路径表达式来选取HTML 文档中的元素节点或属性节点。节点是通过沿着路径 (path) 来选取的。/表示根元素,不能跨越元素标签
5.字符的转义//在xml中不能使用< 与 &,需要转义
1)转义字符
< < 小于
> > 大于
" " 双引号
' ' 单引号
& & 和号
2)CDATA转义
<![CDATA[内容]]>