【XML】
XML?
- 可拓展的标记语言
- 用途:
– 用来保存数据
– 做配置文件
– 数据传输载体 - 倒状树形结构,标签嵌套
写一个XML
文档声明
<?xml version="1.0" ?> //解析时的解析器
<?xml version="1.0" encoding="gbk" ?> //解析编码
<?xml version="1.0" encoding="gbk" standalone="yes" ?> //yes依赖或关联外部文件,no没有依赖或关联
encoding解析
- 在解析xml时用什么编码去解析 - - -解码
- ANSI电脑默认编码gbk,编码和解码的方式不同,会导致解码失败,乱码
元素<>标签
- 成对出现
- 必须要有一个根标签
- 空标签< />
- 可以自己定义
属性
- 元素中添加属性
注释
- < >中间 !-- –
- 快捷键ctrl shift /
- 必须在文档声明下面
非法字符转义
- <;—— <
- >;—— >
CDATA区
- 服务端给客户端传数据时会使用
< ![CDATA][<> </> ]> - 作用:内容包含了标签形式但不想让xml解析
XML解析方式
面试题
DOM解析
- 把所有文档存到内存形成树形结构
- 整个树状结构称为document对象,标签称为element对象,属性称为attribute对象,文本称为text对象)—— 统称为Node节点
- 若xml特别大,会内存溢出
- 可以对文件进行增删操作
SAX解析
- Simpel API for xml 基于事件驱动,读取一行解析一行
- 不会造成内存溢出
- 不能增删,只能查询
针对XML解析方式给出的解决方案有哪些?
jaxp
- sun公司,比较繁琐
jdom
dom4j
- 使用广泛
dom4j
使用
- 下载dom4j的jar包 —— dom4j-1.6.1.jar
- 放在lib下build path一下
- 代码:
try {
//1.创建sax对象
SAXReader reader = new SAXReader();
//2.制定解析xml源
Document document = reader.read(new File("src/com/zd/xmltest/demo.xml"));
//3.得到元素(根元素:getRootElement)
Element rootElement = document.getRootElement();
//4.得到根元素的子元素(stu)(.elements()得到所有的子元素)
List<Element> elements = rootElement.elements();
//5.遍历所有的元素(.getText()获取文本)
for(Element e : elements){
System.out.println(e.element("name").getText());
System.out.println(e.element("age").getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
层级过多 —— XPath语法
- 快速定为到某一元素selectNodes( )
- /从aaa/到bbb/找ccc
- //把所有的aaa找出来
- 在dom4j的下载包中的lib里 —— jaxen-1.1-beta-6.jar
- 代码
try {
//1.创建sax对象
SAXReader reader = new SAXReader();
//2.制定解析xml源
Document document = reader.read(new File("src/com/zd/xmltest/demo.xml"));
//3.得到元素(根元素:getRootElement)
Element rootElement = document.getRootElement();
List<Element> list = rootElement.selectNodes("//name");
for(Element e : list){
System.out.println(e.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
XML约束
DTD
- 可读性差,不易解析
- <!ATTLIST 元素名称 属性名称 类型>
- <!ELEMENT 元素名称 类型名>
- 新建文件xml dtd的
- 创建一个XXX.dtd文件写入简单元素和复杂元素
- 代码:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT stus (stu)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
- 在xml中引入DTD文件
- 网络引入:<>!DOCTYPE stus PUBLIC “//UNKNOWN/” “unknown.dtd”>
- 本地引入:<>!DOCTYPE stus SYSTEM “demo.dtd”>
- 内嵌定义:<>!DOCTYPE stus SYSTEM “demo.dtd”>
- +代表一个或多个
- *代表零个或多个
- ?零个或一个
- <!ELEMENT stu (name,age)>两个都有且顺序不变
- <!ELEMENT stu (name|age)>两个元素有一个就行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE stus [
<!ELEMENT stus (stu)+>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<stus>
<stu>
<name>张三</name>
<age>18</age>
</stu>
</stus>
Schema
- 就是xml,解析方便,为了替代,没有真正替代
- 新建文件 xml schema 的 XXX.xsd
- 留下名称空间(xmlns:w3c的标准)、目标名称空间(targetNamespace:下面定义的元素都要与这个名称空间绑定)、elementFormDefault:元素的格式化情况
- 先写元素,分为简单复杂元素用complexType>sequence>嵌套
- 代码
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/Teacher"
elementFormDefault="qualified">
<element name="stus">
<complexType>
<sequence>
<element name="stu">
<!-- 用来声明这是一个复杂元素的 -->
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
- 在xml中引入Schema文件
- 在xml中写入根标签,提示选xsinsp选项
- 加上xmlns=Schema文件的目标空间
- xsi:schemaLocation="{namespace} {location}"
- sequence maxOccurs=“unbounded”>可以不限子元素次数
<?xml version="1.0" encoding="UTF-8"?>
<stus
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/Teacher"
xsi:schemaLocation="http://www.example.org/Teacher Teacher.xsd">
<stu>
<name>张三</name>
<age>18</age>
</stu>
</stus>
名称空间的作用
- 约束用DTD只能用一个
- 用 Schema可以使用多个,声明名声空间时
- xmlns:aa=“http://www.example.org/Teacher”
xmlns:bb=“http://www.example.org/Teacher” - aa:元素