【XML】浅析XML

目录

一、XML介绍

二、XML语法

     1、文档声明

     2、标签(元素)

     3、属性

     4、注释

     5、CDATA区

三、XML约束

      1、DTD约束

          1.1文档格式

          1.2约束元素的理解

          1.3标签类型

          1.4数量词

         1.5属性声明

     2、schema约束

          2.1文档格式

四、XML解析

      1、三种解析方法

      2、解析工具

     3、解析原理及结构模型 

     4、DOM4J与XPath使用和方法

          4.1常用方法

           4.2XPath使用


一、XML介绍

       XML:其全称---》可扩展的编辑(标签)语言。是一门独立的语言,有自己特有的语法规则。本质上是一个“纯文本文件”。XML的设计宗旨是传输数据,而非显示数据,并且XML标签没有被预定义,我们可以自行定义标签

二、XML语法

XML语法的主要组成:文档声明、标签、属性、注释、转义字符和CDATA区

     1、文档声明

格式:

<?xml version = “1.0(或者1.1)"  encoding = “UTF-8" ?>

作用:

文档声明是给XML文件的编辑器、解析器看的,用于识别XML的版本语法,以及编码方式等。

注意事项:

1、一个标准的XML文档通常会在0行0列的位置定义

2、文档声明并非必须的

     2、标签(元素)

标签:也叫“标记、元素”,是XML的重要组成部分

格式:

1)完整标签:----》  <name>James<name>

2)单标签 (自闭和标签)  :----》   <student  属性=“属性值” age="18"/>无标签体

注意事项:

1)标签的名称只能包含:字母(包括中文)、数字、四个符号(_、-、:、.)

2)数字、符号不能开头,中间不能有“空格”[尽量以英文开头,英文结束,不携带中文,数字,符号等]

3)XML的标签区分大小写

4)标签可以嵌套

示例:

<students>
    <student>
        <name>张三</name>
    </student>
</students>

     3、属性

格式:

任何标签都可以定义属性,完整标签只能写在开始标签中,自闭和标签不能写在/后

注意事项:

1)属性值必须用一对双引号或者单引号括起来

2)一个标签可以有多个属性,但是不能重名

3)一个标签可以定义多个属性,每个属性之间需要用“”空格“”隔开

<student id = “it001" name = “张三" age = “18" sex = “男"/>

     4、注释

格式:

<!--注释内容-->

注意事项:

1)注释不能写在“标签名”的里面

2)主是不能嵌套

<!-- 学员信息-->
<students>
    <student>
        <!-- 学员信息-->
        <name>张三</name>
        <age>19</age>
    </student>
</student>

     5、CDATA区

在XML中,有一些特有的关键的符号,例如,(>、<、&等),这种字符,容易对XML的编码造成影响,一种解决方式是使用转定义符:常用的几种转定义符如下:

                

另一种解决方式就是将XML内容写在CDATA区中

        CDATA区中的内容全部认为是文本 没有特殊符号。

<![CDATA[
        String str = “fjdsEFeafeEW1432”;
        int count = 0;
        for(int i = 0;i < str.length() ; i++){
            char c = str.charAt(i);
            if(c >= ‘0’ && c <= ‘9’){
                count++;
            }
        }
        System.out.println(“count = “ + count);
]]>

三、XML约束

        XML约束:在我们应用XML过程中,XML应该被赋予一些约束,用来规范XML。在应用过程中,约束分为两种:一种是DTD约束,另一种数Schema约束。

         DTD约束:属于旧版本的约束,语法简洁,功能比较单一,适用于一些小型的、简单的文档使用

         schema约束:属于新版本约束,语法复杂,功能比较强大。适用于一些大型的、复杂的文档使用

          约束可以用来约束:

          1)文档中可以出现的标签                              2)标签之间的包含关系                                              

          3)标签出现的顺序                                         4)标签出现的频率等等……

      1、DTD约束

          1.1文档格式

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    在需要使用此dtd的xml中引入约束
    <!DOCTYPE 书架 SYSTEM "book.dtd">
-->
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

在XML中使用以下语句引入约束:

<!DOCTYPE 书架 SYSTEM "book.dtd">

然后可以开始写XML文件内容:

<?xml version="1.0" encoding="utf-8" ?><!--文档声明-->
<!DOCTYPE 书架 SYSTEM "book.dtd"><!--引入DTD约束-->
<书架>
    <书>
        <书名></书名>
        <作者></作者>
        <售价></售价>
    </书>
</书架>

          1.2约束元素的理解

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    在需要使用此dtd的xml中引入约束
    <!DOCTYPE 书架 SYSTEM "book.dtd">
-->
<!ELEMENT 书架 (书+)><!--约束根元素是“书架”,“书架的子元素为书,”,“+”为数量词-->
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

          1.3标签类型

标签类型
标签类型 代码写法 说明
PCDATA (#PCDATA) 被解释的字符串数据
EMPTY EMPTY 空元素
ANY ANY 任意类型
<!ELEMENT 售价 (#PCDATA)> <!--"售价"元素体为字符串数据-->
<!ELEMENT 出版日期 ANY> <!--"出版日期"元素体为任意类型-->
<!ELEMENT 版本号 EMPTY> <!--"版本号"元素体为空元素

          1.4数量词

数量词
数量词符号 含义
* 元素可以出现0~多个
+ 元素可以出现1~多个
元素可以是0或1个
元素按照顺序显示
| 元素需要选中其中某一个

         1.5属性声明

<!ATTLIST 标签名称
       属性名称  属性类型    属性说明>
属性类型
属性类型 含义
CDATA 属性是文本字符串
ID 属性值唯一,不能以数字开头
ENUMERATED 执行范围内进行枚举
属性说明
属性说明 含义
#REQUIRED 属性必须有
#IMPLIED 属性可有可无
#FIXED 属性固定值
<!ATTLIST 书                                <!--设置"书"元素的的属性列表-->
        id ID #REQUIRED                     <!--"id"属性值为必须有-->
        编号 CDATA #IMPLIED                  <!--"编号"属性可有可无-->
        出版社 (清华|北大|传智播客) "传智播客" <!--"出版社"属性值是枚举值,默认为“传智播客”-->
        type CDATA #FIXED "IT"              <!--"type"属性为文本字符串并且固定值为"IT"-->
>

     2、schema约束

简单语法,后期在介绍

          2.1文档格式

<?xml version="1.0" encoding="UTF-8" ?>
<!--
	将注释中的以下内容复制到要编写的xml的声明下面
	复制内容如下:
	<书架 xmlns="http://www.itcast.cn"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		  xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
    >
 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.itcast.cn"
           elementFormDefault="qualified">
    <xs:element name='书架' >
        <xs:complexType>
            <xs:sequence maxOccurs='unbounded' >
                <xs:element name='书' >
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name='书名' type='xs:string' />
                            <xs:element name='作者' type='xs:string' />
                            <xs:element name='售价' type='xs:double' />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

schame约束:能够约束数据的类型

四、XML解析

      1、三种解析方法

1、dom解析:一次性将文档的所有内容读取到内存中,并在内存中生成DOM树模型。

【优点:可以对元素进行增、删操作                          缺点:处理慢、占用内存,只适用于小型文件】

2、SAX解析:一次读取一行,解析一行(只能读)

【好处:处理快,不占用内存                                    缺点:没有文档结构,不能对文档内容进行增、删操作】

3、PULL解析:Android的解析方式

      2、解析工具

1)JAXP解析:JDK自带的解析工具,比较原始、底层,使用起来不方便

2)JSOUP解析:对HTML进行解析(网络爬虫)

3)JDOM解析:DOM4J的兄弟,功能比较弱小,很少使用

4)DOM4J解析:应用最广的一个XML解析工具,内部结合DOM和SAX解析方式

     3、解析原理及结构模型 

        解析原理:XML DOM和HTML DOM一样,将XML文件加载到内存,生成一个DOM树,并获取一个Document对象,通过Document对象就可以对DOM进行操作,

结构模型:

                        

     4、DOM4J与XPath使用和方法

使用步骤:

    1)dom4j是一个第三方的“软件包”

    链接:https://pan.baidu.com/s/1SPxnd7yP_SsgygNKee9Qsw 
    提取码:kcv6

    2)将dom4j的jar包复制到模块目录下,然后右键添加到类库(add  as  library)

          4.1常用方法

构造方法
方法 作用
new  SAXReader 创建saxreader对象(构造方法)
Document  read(string url) 加载执行xml文档
Document对象
方法 作用
Element  getRootElement() 获取根元素
Element对象
方法 作用
List<Element>   elements([String element]) 获取根元素的子元素(可以指定也可以不指定根元素名称)
Element element([String element]) 获取第一个子元素(可以指定,也可以不指定元素名称)
string  getName() 获取当前元素的名称
string attributeValue(string  attrName) 获取指定属性名的属性值
string  elementText(string element) 获取指定名称元素的文本值
string  getText() 获取当前元素的文本内容
public class Test {
    public static void main(String[] args) throws DocumentException {
        //3、利用类加载器创建InputStream流对象
        InputStream in = Test.class.getClassLoader().getResourceAsStream("books.xml");
        //1、创建saxReader对象
        SAXReader saxReader = new SAXReader();
        //2、读取xml文件,获取DOM对象
        Document document = saxReader.read(in);
        //4、获取XML文件的根目录
        Element rootElement = document.getRootElement();

        //5、通过根元素对象获取子元素对象
        List<Element> listElements = rootElement.elements();
        //6、遍历子元素对象
        for (Element listElement : listElements) {
            //获取子元素的id属性名
            /*Attribute name = listElement.attribute("id");
            String value = name.getValue();
            System.out.println(value);
            */
            //获取子元素的子元素
            //  List<Element> elements = listElement.elements();
            // // //遍历子元素集合
            // for (Element childElement : elements) {
            //     //获取指定标签的文本数据
            //     // System.out.println(childElement.getText());//1
            //     // System.out.println(childElement.getStringValue());//2
            // }
            //3、根据名称获取元素
            Element name = listElement.element("name");
            //根据元素获取标签数据
            String text = name.getText();
            //输出值
            System.out.println(text);
            // 4、
            // System.out.println(listElement.elementText("name"));
        }
    }
}

           4.2XPath使用

在DOM4J的基础上,在此导入jaxen-1.1-beta-6.jar包

链接:https://pan.baidu.com/s/1Q5QgiVsdz-v1U-ThpC-gag 
提取码:0lix

可以直接写出想要获取文本信息的路径,然后使用selectISingleNode就可以获取:

public class Test {
    public static void main(String[] args) throws DocumentException {
        //3、利用类加载器创建输出流对象
        InputStream in = Test.class.getClassLoader().getResourceAsStream("books.xml");
        //1、创建 Saxreader对象
        SAXReader saxReader = new SAXReader();
        //2、读取xml文件,获取DOM对象
        Document document = saxReader.read(in);
        //4、获取xml文件的根元素
        Element rootElement = document.getRootElement();
        //5、获取指定标签的文本数据
        Node node = rootElement.selectSingleNode("/books/book/name");
        //6、获取节点的文本数据并解析
        System.out.println(node.getText());
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43267344/article/details/108268887
xml
今日推荐