XML主要作用:
1.保存数据
2.配置文件
3.数据传输载体
XML文档结构:
倒状树形结构
xml文档声明
<?xml version="1.0" encoding="gbk" standalone="no"?>xml文件必须要有一个顶层元素
version是xml的版本
encoding是解析xml所采用的编码
standalone判断是不是一个独立的文档,yes是独立的文档,没有外部引入依赖,no相反。
保存时的编码格式和解析时的编码格式一致,不会产生乱码。
ANSI默认编码GBK。
电脑上的文件在存储的时候,并不是真正的存储文字,而是存储这些文字对应的二进制。
建议使用UTF-8编码。
保存时默认为GBK。
gb2312早期国标。gbk相当于他的进阶版,包含生僻字。
<元素名称 属性名称=“属性的值”></元素名称>
xml注释:与html的注释一样<!-- -->
。
xml的注解不允许放置在文档的第一行,必须在文档声明之下。
严格地讲,在 XML 中仅有字符 “<“和”&” 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。
< <
& &
如果某段字符串里面有过多的字符, 并且里面包含了类似标签或者关键字的这种文字,不想让xml的解析器去解析。 那么可以使用CDATA来!
<des><![CDATA[<a href="">6666</a>]]></des>
XML 解析其实就是获取元素里面的字符数据或者属性数据。
XML解析方式(面试常问)有很多种,但是常用的有两种。
- DOM
- SAX
DOM解析document object model是将整个文档全部读到内存当中形成树状结构。整个文档称之为document对象,属性对应attribute对象,所有的元素节点对应element对象,文本称之为text对象,这四个合起来成为Node节点。当xml特别大的时候,采用DOM解析会造成内存溢出。DOM解析可以对文档进行增删操作。
SAX解析simple api for xml 基于事件驱动。读取一行解析一行,不会造成内存的溢出,不可以进行增删操作,只能进行查询。
针对以上两种解析方案的api,目前dom4j用的比较广泛。
SAX的简单使用
//创建SAX读取对象
SAXReader saxReader = new SAXReader();
try {
//制定解析的xml文件 需要导入dom4j-1.6.1.jar
Document read = saxReader.read(new File("src/NewFile.xml"));
// 得到根元素
Element rootElement = read.getRootElement();
// 获取根元素下的子元素
rootElement.element("stu").getName();
rootElement.element("stu").element("age").getStringValue();
// 根元素下的所有子元素
List elements = rootElement.elements();
System.out.println(rootElement.getName());
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
DOM4j的Xpath使用
dom4j里面支持Xpath的写法,xpath其实是xml的路径语言,支持在我们解析xml的时候快速定位。
//要想使用Xpath,还需要导入jar包。 jaxen-1.1-beta-6.jar
Element nameElement=(Element) rootElement.selectSingleNode("//name");
List<Element> list = rootElement.selectNodes("//name");
XML的文档约束两种:DTD和Schema。
Schema是DTD的继承者。
DTD语法自成一派,早期就出现的。 可读性比较差。
Schema其实就是一个xml,使用xml的语法规则,解析比较方便。 但是他的约束文件的内容比DTD的还要多,所以目前还没有真正意义上的替代DTD。
DTD的用法
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入DTD来约束这个xml文件 -->
<!--文档类型 根标签名字 本地的dtd -->
<!-- <!DOCTYPE stus SYSTEM "stus.dtd"> -->
<!-- 文档类型 根标签名字 网络上的dtd dtd的名称 dtd的路径
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD文档的URL"> -->
<!DOCTYPE stu [
<!ELEMENT stus (stu)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<stus>
<!-- 11111111 -->
<stu>
<name>122</name>
<age>12</age>
<!-- <address><![CDATA[<a>hdhhdhdh</a>]]></address> -->
</stu>
</stus>
声明元素的属性:
<stu id="123">
<!ATTLIST stu id CDATA #IMPLIED> IMPLIED代表属性可有可无。或者这个用默认值代替。也可以写成ID,代表唯一id。
<!ELEMENT stus (stu)+> +一个或多个 * 零个或多个 ?零个或一个
<!ELEMENT stu (name,age)> 按照顺序来
<!ELEMENT stu (name|age)> 两个中只能包含一个子元素。
schema的简单使用:
xmlns="http://www.w3.org/2001/XMLSchema" 命名空间
targetNamespace="http://www.example.org/NewXMLSchema" 目标的名称空间,下面定义的那些元素都与这个名称空间绑定上。
elementFormDefault="qualified"> 元素的格式化情况。
xml如果是这样
<?xml version="1.0" encoding="UTF-8"?>
<!--
xmlns:xsi : 这里必须是这样的写法,也就是这个值已经固定了。
xmlns : 这里是名称空间,也固定了,写的是schema里面的顶部目标名称空间
xsi:schemaLocation : 有两段: 前半段是名称空间,也是目标空间的值 , 后面是约束文档的路径。
-->
<teachers
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/NewXMLSchema"
xsi:schemaLocation="http://www.example.org/NewXMLSchema NewXMLSchema.xsd">
<teacher>
<name>122</name>
<age>12</age>
</teacher>
</teachers>
那么,Schema约束文件就是:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/NewXMLSchema"
elementFormDefault="qualified">
<!-- 这是一个复杂元素 -->
<element name="teachers">
<complexType>
<!-- unbounded无限个teacher,也可以直接填入个数 -->
<sequence maxOccurs="unbounded">
<!-- 这是一个复杂元素 -->
<element name="teacher">
<complexType>
<sequence>
<!-- 简单元素 -->
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
名称空间的作用:
xml只能引入一个DTD文件约束,但是可以引用多个Schema文件约束。
引入多个Schema的时候声明需要这样写:
xmlns::aa="http://www.example.org/NewXMLSchema"
xmlns::bb="http://www.example.org/NewXMLSchema"
元素用哪个约束可以这样写:
<bb:name>122</bb:name>
<aa:age>12</aa:age>
名称空间的作用就是在写元素的时候,指定该元素用的是哪套约束规则。