XML

XML出现的原因就是为了解耦,结果后来一大堆xml配置文件让人头大,现在又开始使用注解这种紧耦合的方式,真是合久必分,分久必合。

基本语法

xml一般作为配置文件,并且大小写敏感。
其声明为:<?xml version="1.0" encoding="UTF-8" ?>代表这是一个使用UTF-8的版本1.0的xml文件

标签分为双标签和单标签:
双标签:<标签名 属性名=属性值 属性名=属性值></标签名>
单标签:<标签名/>;带属性的单标签:<标签名 属性名=属性值 属性名=属性值/>

注释:<!--注释内容-->

预定义字符实体,即转义字符:

格式代表符号描述
&lt;<小于号
&gt;>大于号
&amp;&and
&apos;'单引号
&quot;"双引号

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>
  1. schema约束的结构和xml文件书写规范是一样的,<?xml version="1.0" encoding="UTF-8"?>表示对xml的声明,是根标签
  2. xmlns="http://www.w3.org/2001/XMLSchema" 表示此schema文件受到w3组织的指定的约束
  3. targetNamespace="http://www.example.org/books",叫做名称空间,这个相当于java中包的作用,区分不同约束中的不同标签。当需要被当前这个schema文件约束的xml文件,需要通过当前这个名字引入当前schema文件
  4. 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>

说明:

  1. xml中出现的标签需要使用<element name="标签名"></element>这样的语法来定义。即先清楚xml中需要多少个标签,在Schema文件中就书写多少个element标签。所以xml中第一个出现的books标签需要使用<element name="books"></element>来声明。element标签中的 name属性 就是xml中 可以书写的标签的名字。
  2. 为了方便schema约束的书写,我们将xml中的标签简单的分为2大类:
    a) 简单标签 : 标签中只有文本数据;
    b) 复杂标签:标签中有子标签或者属性加上文本数据;
    在element标签中需要使用complexType声明当前的element标签name属性指定的是一个复杂标签。
    如果是简单标签可以使用simpleType。
  3. 上述在books.xml文件中我们发现books标签是复杂标签,针对复杂标签,需要在当前的标签中书写子标签来限制当前复杂标签中的其他内容。所以我们需要使用标签来声明books标签是一个复杂标签。并且针对复杂标签中出现的子标签,我们需要使用标签来声明子标签出现的顺序。
  4. A)books标签中出现的子标签是book,由于book也是一个标签,所以我们也需要使用标签来声明xml中的book;
    B)并且book标签也是一个复杂标签,所以我们需要使用标签来声明;
    C)book标签中也有子标签,所以还需要使用来声明子标签的顺序;
    D)最后发现book标签在books.xml出现了多次,所以需要给加上maxOccurs="unbounded"属性。表示book标签可以出现很多次。(没有次数的限制)
    大于等于1次
  5. 最后在里面写上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如下:

  1. SaxReader对象

    • 使用SaxReader类中的read(url) 方法加载执行xml文档来获取Document类的对象。(url相对项目根目录)
  2. Document对象

    • 使用Document类中的getRootElement()方法获得根标签。返回值类型为Element。
      举例:Element books = document.getRootElement();
  3. Element对象

    • 使用Element类中的elements()方法 获得指定名称的所有子元素。
      举例:List bookList = books.elements();
    • 使用Element类中的element(tagName) 获得指定名称的子标签。
      举例:Element name =book.element("name");
    • attributeValue(…) 获得指定属性名的属性值。
    • getText() 获得当前元素的文本内容。
      name.getText();

XPath

xpath其实就像在文件系统中定位文件,学习xpath主要学习xpath的路径表达式。
常用表达式:

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
.选取当前节点
..选取当前节点的父节点
@选取属性

烂尾了,不填

标签: Web

添加新评论