XML学习笔记
一、XML作用
1、可以用来保存数据;
2、可以用来做配置文件;
3、数据传输载体;
二、文档声明
1、简单声明,version:解析这个xml的时候,使用什么版本的解析器解析
<?xml version="1.0" ?>
2、encoding:解析xml中的文字的时候,使用什么编码去解析翻译
<?xml version="1.0" encoding="gbk" ?>
3、standalone:no -该文档会依赖关联其它文档,yes -这是一个独立文档
<?xml version="1.0" encoding="gbk" standalone="no" ?>
4、encoding详解:文字在存储过程中存储的是对应二进制,若系统默认存储的字符集是gbk,而文档设置解析字符集是utf-8时,此时解析就会出现乱码情况,因为不匹配。
系统默认使用的是GBK编码保存,所以想要xml文档能够正常显示中文,解决方法两种:
①让encoding也是GBK活着GB2312(GBK的老版)
②如果encoding是utf-8,则保存文件时保存成utf-8即可。
③若保存的是ANSI编码,则对应的就是本地编码GBK。
提示:正常推荐使用utf-8,通用字符集。
三、元素定义(标签)
1、< > 括起来的都叫元素,成对出现。 如:<stu> </stu>
2、文档声明下来的第一个元素叫做根元素(根标签),其余标签必须放在根标签内。
3、标签内可以嵌套标签
4、空标签 <标签名/>
四、注释
<!-- --> 注释不能放在第一行,必须放在文档声明下。
五、CDATA区
如果某段字符串里面有过多的字符,并且里面包含了类似标签或者关键字的文字,不想让xml的解析器去解析,那么可以使用CDATA来包装。不过这个CDATA一般少见,通过在服务器给客户端返回数据时常见。
格式:<![CDATA[ 字符串 ]]>
六、XML解析方式(面试常问)
XML解析方式有很多种,常用的有DOM和SAX两种:
针对以上常用的两种解析方式,我们常用的API有jaxp(sun公司,比较繁琐),jdom,dom4j(使用最广泛)。
七、Dom4j基本用法
1、创建SaxReader对象
SAXReader reader = new SAXReader();
2、指定解析的xml
Document document = reader.read(new File("src/xml/student.xml"));
3、获取根元素
Element rootElement = document.getRootElement();
4、根据根元素获取子元素或者下面的子孙元素
Element stuElement = rootElement.element("stu");
八、dom4j 之 Xpath 的使用
1、添加jar包 jaxen-1.1-beta-6.jar
2、查找指定节点的时候需要根据Xpath语言进行查找
3、后续代码和正常XML代码一样
例如:
//获取第一个元素名为name的元素 Element nameElement = (Element) rootElement.selectSingleNode("//name"); System.out.println(nameElement.getText()); //获取所有名为name的元素 List<Element> namesElement = rootElement.selectNodes("//name");
九、XML文档的约束(DTD、Schema)
DTD:语法自成一派,早期就出现,可读性较差。
Schema:相当于一个xml,使用xml的语法规则,xml解析器解析比较方便,是为了替代DTD出现的,但是Schema约束文本内容比DTD多,所以目前也还没真正替代DTD。
1、DTD:
<!-- 引入DTD来约束xml,三种方法,网络,本地,内建--> 引入网络: <!--引入网络写法:文档类型 根标签名字 网络上的dtd dtd的名称 dtd的路径 <! DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd">--> 引入本地: <!--引入本地写法:文档类型 根标签名字 SYSTEM dtd的路径 --> <!--本地例子:<!DOCTYPE stus SYSTEM "student.dtd">--> xml内建: <!--内建DTD写法: <!DOCTYPE 根标签名字 [DTD代码] > --> <!--内建例子 <!DOCTYPE stus [<!ELEMENT stus(stu)> <!ELEMENT stu(name,age,telephone)> <!ELEMENT name(#PCDATA)> <!ELEMENT age(#PCDATA)> <!ELEMENT telephone(#PCDATA)>]> -->
<!ATTLIST stu id CDATA #IMPLIED> stu有一个属性,文本类型,该属性可有可无。
元素的个数:
+ 一个或多个
* 零个或多个
? 零个或一个
属性的类型定义:
CDATA:属性是普通文字
ID:属性的值必须唯一
<!ELEMENT stu (name,age)> name和age按照顺序来
<!ELEMENT stu(name | age)> 两个中只能有一个
2、Schema
实例文档:
<?xml version="1.0" encoding="utf-8" ?> <!-- xmlns: xml namespace :名称空间/命名空间 targetNamespace:目标名称空间。下面定义的那些元素都与这个名称空间绑定上。 elementFormDefault:元素的格式化情况。 --> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/student" elementFormDefault="qualified"> <element name="stus"> <complexType> <sequence maxOccurs="unbounded"> <!--这是一个复杂元素--> <element name="stu"> <!--这是一个复杂元素--> <complexType > <sequence> <!--这是简单元素--> <element name="name" type="string"></element> <element name="age" type="int"></element> <element name="telephone" type="string"></element> </sequence> </complexType> </element> </sequence> </complexType> </element> </schema>
3、名称空间的作用
一个xml如果想指定它的约束规则,假设使用的是DTD,那么这个xml只能指定一个DTD,不能指定多个DTD,但是如果一个xml的约束是定义在schema里面,并且是多个schema,那么是可以的。
简单说:一个xml能引用多个schema,但是只能引用一个DTD。
名称空间的作用就是:在写元素的时候,可以指定使用哪一套规则,默认情况下只有一套那就都用这一套,不需指定。