Web基础之XML
XML
XML出现的原因就是为了解耦,结果后来一大堆xml配置文件让人头大,现在又开始使用注解这种紧耦合的方式,真是合久必分,分久必合。
基本语法
xml一般作为配置文件,并且大小写敏感。
其声明为:<?xml version="1.0" encoding="UTF-8" ?>
代表这是一个使用UTF-8的版本1.0的xml文件
标签分为双标签和单标签:
双标签:<标签名 属性名=属性值 属性名=属性值></标签名>
单标签:<标签名/>
;带属性的单标签:<标签名 属性名=属性值 属性名=属性值/>
注释:<!--注释内容-->
预定义字符实体,即转义字符:
格式 | 代表符号 | 描述 |
---|---|---|
< | < | 小于号 |
> | > | 大于号 |
& | & | and |
' | ' | 单引号 |
" | " | 双引号 |
CDATA区:CDATA区可以保证数据的原文输出。让文本去原样显示的。 <![CDATA[原文显示的内容,不会被转义]]>
约束
DTD约束
DTD约束声明:<!DOCTYPE 根元素 [元素声明]>
元素声明:<!ELEMENT 元素名称 (元素内容)>
元素内容包括:符号、数据类型和标签。
常见符号:
符号 | 描述 | 栗子 | ||
---|---|---|---|---|
? | 表示该对象只能出现一次 | (樱花庄?) | ||
* | 表示该对象可出现任意次 | (素晴*) | ||
+ | 表示该对象至少出现一次 | (男高+) | ||
() | 用来给元素分组 | (阿库娅\ | 慧慧),真和 | |
\ | 表名在列出的元素中选择一个 | (男\ | 女) | |
, | 表示对象必须按指定的顺序出现 | (玛丽罗斯,蕾姆,拉姆) |
常见数据类型:#PCDATA
表示内容是文本,不能是子标签。
声明属性:<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型:
类型 | 描述 | ||
---|---|---|---|
CDATA | 值为字符数据 (character data) | ||
(en1\ | en2\ | ..) | 此值是枚举列表中的一个值 |
ID | 值为唯一的 id |
默认值参数:
值 | 解释 |
---|---|
值 | 属性的默认值 |
\#REQUIRED | 属性值是必需的 |
\#IMPLIED | 属性不是必需的 |
\#FIXED value | 属性值是固定的 |
Schema约束
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/books"
elementFormDefault="qualified">
</schema>
- schema约束的结构和xml文件书写规范是一样的,
<?xml version="1.0" encoding="UTF-8"?>
表示对xml的声明,是根标签 xmlns="http://www.w3.org/2001/XMLSchema"
表示此schema文件受到w3组织的指定的约束targetNamespace="http://www.example.org/books"
,叫做名称空间,这个相当于java中包的作用,区分不同约束中的不同标签。当需要被当前这个schema文件约束的xml文件,需要通过当前这个名字引入当前schema文件elementFormDefault="qualified"
,如果值为qualified,那么当前schema中所有的标签默认都是放在名称空间中的。如果值为unqualified,那么除了schema中的根标签在名称空间即 http://www.example.org/books 包中,其他的标签都不会在这个包中。在开发中都是书写默认值qualified。
举例:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/books"
elementFormDefault="qualified">
<!-- 在此处书写schema约束语法 -->
<element name="books">
<complexType><!-- 声明books是复杂标签 -->
<sequence><!-- 通过sequence标签指定子标签的顺序 -->
<element name="book" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="author" type="string"></element>
<element name="price" type="double"></element>
</sequence>
<attribute name="address"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
说明:
- xml中出现的标签需要使用
<element name="标签名"></element>
这样的语法来定义。即先清楚xml中需要多少个标签,在Schema文件中就书写多少个element标签。所以xml中第一个出现的books标签需要使用<element name="books"></element>
来声明。element标签中的 name属性 就是xml中 可以书写的标签的名字。 - 为了方便schema约束的书写,我们将xml中的标签简单的分为2大类:
a) 简单标签 : 标签中只有文本数据;
b) 复杂标签:标签中有子标签或者属性加上文本数据;
在element标签中需要使用complexType声明当前的element标签name属性指定的是一个复杂标签。
如果是简单标签可以使用simpleType。 - 上述在books.xml文件中我们发现books标签是复杂标签,针对复杂标签,需要在当前的标签中书写子标签来限制当前复杂标签中的其他内容。所以我们需要使用
标签来声明books标签是一个复杂标签。并且针对复杂标签中出现的子标签,我们需要使用 标签来声明子标签出现的顺序。 - A)books标签中出现的子标签是book,由于book也是一个标签,所以我们也需要使用
标签来声明xml中的book;
B)并且book标签也是一个复杂标签,所以我们需要使用标签来声明;
C)book标签中也有子标签,所以还需要使用来声明子标签的顺序;
D)最后发现book标签在books.xml出现了多次,所以需要给加上maxOccurs="unbounded"属性。表示book标签可以出现很多次。(没有次数的限制)
大于等于1次 - 最后在里面写上book标签中出现的3个name,author,price子标签的声明。并且针对book标签中出现的属性。我们需要使用
<attribute name="属性名">
这样的语法来声明。注意<attribute>
标签的位置。
在xml中引入schema约束:
<?xml version="1.0" encoding="UTF-8"?>
<books xmlns="http://www.example.org/books"
xsi:schemaLocation="http://www.example.org/books books.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
<book address="新华书店">
<name>Java</name>
<author>TheAuthor</author>
<price>100</price>
</book>
</books>
XML解析
常见解析方式:
- DOM解析:将文档整体加载到内存形成一个DOM树在解析,DOM解析支持文档的增删改查。
- SAX解析:读取一行解析一行,只支持文档的查询,不支持文档的增删改查。
- PULL解析:类似SAX解析,Android的常用解析技术。
dom解析与sax解析的区别:
- dom:整个文档加载,可以增删改查,效率低。
- sax: 逐行解析,不可以增删改,只是支持查询,效率高。
常用解析技术(具体实现):
- JAXP:SUN公司的官方解析技术,支持DOM解析和SAX解析。
- JSOUP:一种解析HTML的特定解析的开发包。网络爬虫
- JDOM:开源组织的DOM方式的解析技术。
- DOM4J:JDOM的分离版 增强版,开源,dom解析方式,Hibernate底层的XML解析技术。
常用API如下:
SaxReader对象
- 使用SaxReader类中的read(url) 方法加载执行xml文档来获取Document类的对象。(url相对项目根目录)
Document对象
- 使用Document类中的getRootElement()方法获得根标签。返回值类型为Element。
举例:Element books = document.getRootElement();
- 使用Document类中的getRootElement()方法获得根标签。返回值类型为Element。
Element对象
- 使用Element类中的elements()方法 获得指定名称的所有子元素。
举例:ListbookList = books.elements(); - 使用Element类中的element(tagName) 获得指定名称的子标签。
举例:Element name =book.element("name"); - attributeValue(…) 获得指定属性名的属性值。
- getText() 获得当前元素的文本内容。
name.getText();
- 使用Element类中的elements()方法 获得指定名称的所有子元素。
XPath
xpath其实就像在文件系统中定位文件,学习xpath主要学习xpath的路径表达式。
常用表达式:
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
烂尾了,不填