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两种:

XML学习笔记

针对以上常用的两种解析方式,我们常用的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");

XML学习笔记

八、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。

1DTD:

<!-- 引入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)>]>           -->

XML学习笔记

<!ATTLIST stu id CDATA #IMPLIED> stu有一个属性,文本类型,该属性可有可无。

元素的个数:

+   一个或多个

*   零个或多个

? 零个或一个

属性的类型定义:

CDATA:属性是普通文字

ID:属性的值必须唯一

<!ELEMENT stu (name,age)>   name和age按照顺序来

<!ELEMENT stu(name | age)>   两个中只能有一个

2Schema

实例文档:

<?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。

名称空间的作用就是:在写元素的时候,可以指定使用哪一套规则,默认情况下只有一套那就都用这一套,不需指定。