⑩XML(1)

1 xml 简介

XML(Extensible Markup Language):可扩展性标记语言
什么是可扩展性标记语言呢?
标记性语言:用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。html是标记型语言、使用标签操作。
可扩展性:标签 不是固定的,可以自己定义
html:旨在显示数据。html里的标签都是固定的,每个标签都有特定的含义。
xml:旨在传输数据。可以自定义标签。

2 xml作用

XML可以在保存数据的同时保存数据之间的关系,可以用在不同系统之间传输数据
用作应用程序配置文件使用。
XML 文档形成了一种树结构,它从”根部”开始,然后扩展到”枝叶”。
XML将数据组织成为一棵树,DOM 通过解析 XML 文档,为 XML 文档在逻辑上建立一个树模型,树的节点是一个个的对象。这样通过操作这棵树和这些对象就可以完成对 XML 文档的操作,为处理文档的所有方面提供了一个完美的概念性框架。

![这里写图片描述](https://img-blog.csdn.net/20180522152712552?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2poXzU5MzU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

3 xml语法

3.1文档声明
用来声明xml的基本属性,用来指挥解析引擎如何去解析当前xml
通常一个xml都要包含并且只能包含一个文档声明
xml的文档必须在整个xml的最前面,在文档声明之前不能有任何内容
     <?xml version="1.0" ?>

–version是必须存在的属性,表明当前xml所遵循规范的版本

<?xml version="1.0" encoding="utf-8" ?>

–encoding用来只会解析引擎在解析xml时使用的编码,一定要保证xml格式的数据在保存时使用的编码和解析时使用的编码必须一致,才不会有乱码问题

<?xml version="1.0" encoding="utf-8" standalone="yes" />

—standalone属性用来指明当前xml是否是一个独立的xml,默认值是yes表明当前文档不需要依赖于其他文档,如果当前文档依赖其他文档而存在则需要将此值设置为no

3.2 元素

一个xml标签就是一个元素, 一个标签分为开始标签和结束标签,在开始标签和结束标签之间可以包含文本内容,这样的文本内容叫做标签体

双标签:<标签名> 内容(文本,其他标签) </标签名>

如果标签的开始标签和结束标签之间不包含标签和子标签则可以将开始标签和结束标签进行合并,这样的标签就叫做自闭标签

单标签:<标签名 />
<a/>

一个标签中也可以包含任意多个子标签,但是一定要注意标签一定要合理嵌套
一个格式良好的xml要包含并且只能包含一个根标签,其他的标签都应该是这个标签的子孙标签
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:

区分大小写,例如,<P><p>是两个不同的标记。
不能以数字或标点符号或"_"开头。
不能以xml(或XML、或Xml 等)开头。
 不能包含空格.
 名称中间不能包含冒号(:)。

标签名是我们自己定义的。建议大家。采用标识符的命名规则去给一个标签起名字。(数字字母下划线,并且数字不能作为开头)

3.3 属性

属性:书写在标签内的。对标签的数据进行扩展。对标签的进一步描述。
写法:

<标签名 属性名="属性值" 属性名="属性值">

属性名也是自定义的。要遵循和xml元素相同的命名规则
一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

<china capital="beijing"/> 

属性的值需要用单引号或双引号括起来

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

注释可以出现在xml文档的任意位置除了整个文档的最前面.不能出现在文档声明之前
注释不能嵌套注释

3.5 CDATA区/转义字符

语法:

<![CDATA[ 原封不动显示的内容 ]]>
<user>
    <name>
        <![CDATA[
            张</name>    
         ]]>

    </name>
    <psw>
        <![CDATA[
            123 
        ]]>
     </psw>
</user>

当XML中一段内容不希望被解析器解析时可以使用CDATA区将其包住当解析器遇到CDATA区时会将其内容当作文本对待,不会进行解析

<font size=2>转义字符: 
       &  --> &amp; 
       <  --> &lt;
       >  --> &gt;
       "  --> &quot;
       '  --> &apos;
3.6 处理指令

语法:

<?指令名 key=value key=value ?>

处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。

 <?xml-stylesheet type="text/css" href="1.css"?>

XML声明语句就是最常见的一种处理指令。

4 xml约束

4.1 xml约束简介

什么是xml约束?
在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为XML约束
html其实就是在xml的基础上加上了大量的约束。
为什么要使用xml约束?
我们从网上下载了一个开源框架,这个开源框架是使用XML作为配置文件的,这时候框架的设计者就需要约束我们配置文件的写法。
xml约束的作用?
约束xml文档的写法;对xml进行校验.
可以限定xml中标签的内容。
可以帮助程序员进行提示(标签内容)
还可以帮助程序员,校验xml书写的是否正确。
.常见的xml约束技术?
(1)XML DTD:最早的xml约束,.dtd平面文档
(2)XML Schema:新的xml文档约束,用来替代dtd。

4.2XML DTD的引入方式
4.2.1 引入外部独立的dtd文件:

此时standalone=”no”
文件清单:book.xml

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
    <>
        <书名>小团圆</书名>
        <作者>张爱玲</作者>
        <售价>39.00元</售价>
    </>
    <>
        <书名>假如给我三天光明</书名>
        <作者>海伦·凯勒</作者>
        <售价>48.00元</售价>
    </>
</书架>

文件清单:book.dtd
注意:.dtd文件应使用UTF-8或Unicode编码

    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售价 (#PCDATA)>
4.2.1 定义在xml文件内部

此时文档声明中的standalone=”yes”

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <!DOCTYPE 书架 [
            <!ELEMENT 书架 (书+)>
            <!ELEMENT 书 (书名,作者,售价)>
            <!ELEMENT 书名 (#PCDATA)>
            <!ELEMENT 作者 (#PCDATA)>
            <!ELEMENT 售价 (#PCDATA)>
        ]>
            <书架>
              <>
                      <书名>明天,你好</书名>
                      <作者>小霍霍</作者>
                     <售价>39.00元</售价>
            </>
               ...
           </书架>

名称空间的概念:全世界独一无二的名字,用来唯一标识某个资源

4.3 XML Schema 新约束
4.3.1 Schema简介

XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性.
XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd。
一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档
和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为Schema。
编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。
book.xsd文件:

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                      targetNamespace=“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:string' />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:

<itcast:书架 xmlns:itcast=“http://www.itcast.cn”>
        <itcast:书>……</itcast:书>
    </itcast:书架>
4.3.2 Schema与 DTD的比较

  • XML Schema符合XML语法结构。
  • DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
  • XML Schema对名称空间支持得非常好。
  • XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
  • XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
  • XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。
  • 4.3.3 在XML中引入Schema约束

    schema文件内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- schema 就是schema的根标签 targetNamespace:名称空间,当前的schema唯一标识,值可以是任意的字符串,
         xmlns="http://www.w3.org/2001/XMLSchema" 引入约束。固定格式,引入w3c组织为schema文件本身定义好的约束
         elementFormDefault:指定xml中使用别名的情况 -->
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.itcast.cn/books" elementFormDefault="qualified">
        <element name="books">
           <!-- 定义当前的标签是一个复杂标签 -->
            <complexType>
                <!-- 在 sequence 去定义子标签出现的顺序,定义子标签 -->
                <sequence>
                    <element name="book">
                        <complexType>
                           <sequence>
                                <element name="name"></element>
                                <element name="author"></element>
                                <element name="price"></element>
                            </sequence>
                        </complexType>
                    </element>
                </sequence>
            </complexType>
        </element>
    </schema>

    xml文件内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <!--
        在根标签上书写属性
        xmlns:引入约束     目标schema文件的名称空间
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 写法固定。表示当前的xml文件是一个schema约束的实例。
        xsi:schemaLocation:去引入 shcema文件名字空间,并找到具体的文件
        格式:shcema文件名字空间      空格    具体的shcema文件
    -->
    <books
            xmlns="http://www.itcast.cn/books"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.itcast.cn/books books.xsd"
    >
        <book>
            <name>葵花宝典</name>
            <author>东方不败</author>
            <price> 9.9</price>
        </book>
    </books>

    注意:
    1、xml文件中xmlns属性的值,一定要和 schema文件的targetNamespace 属性的值一致。
    2、xml文件中xsi:schemaLocation属性的值的前半部分一定要和 schema文件 targetNamespace 属性的值一致。
    3、xml文件中xsi:schemaLocation属性的值的后半部分 一定要和 schema文件名一致。

    这里写图片描述

    5 XML编程(CRUD)

    利用java程序去增删改查(CRUD)xml中的数据

    5.1XML的两种解析方式
    5.1.1dom解析:

  • 将整个XML使用类似树的结构保存在内存中,再对其进行操作。
  • 是 W3C 组织推荐的处理 XML 的一种方式。
  • 需要等到XML完全加载进内存才可以进行操作
  • 耗费内存,当解析超大的XML时慎用。
  • 可以方便的对xml进行增删该查操作
  • 5.1.2 sax解析

  • 逐行扫描XML文档,当遇到标签时触发解析处理器,采用事件处理的方式解析xml
  • (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所
  • 有的 XML 解析器都支持它。
  • 在读取文档的同时即可对xml进行处理,不必等到文档加载结束,相对快捷
  • 不需要加载进内存,因此不存在占用内存的问题,可以解析超大XML
  • 只能用来读取XML中数据,无法进行增删改
  • 5.2 XML解析开发包
    5.2.1 sax解析Jaxp(sun,j2se)

    JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成
    获取Transformer工厂:

    TransformerFactory transformerFactory = TransformerFactory.newInstance();

    获取Transfomer对象:

    Transformer transformer =  transformerFactory.newTransformer();

    创建代表输入的Sourcet对象:

    Source source = new DOMSource(doc);

    创建代表输出的Result对象:

    Result result = new StreamResult(new FIle("book.xml"));

    使用Transformer将XMLSource转换为Result:

    transformer.transform(source , Result);
    5.2.2 sax解析dom4j(dom4j)

    SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器。
    SAX每当解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。

    ![这里写图片描述](https://img-blog.csdn.net/2018052216410026?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2poXzU5MzU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 使用SAXParserFactory创建SAX解析工厂:
     SAXParserFactory spf = SAXParserFactory.newInstance();

    通过SAX解析工厂得到解析器对象:

     SAXParser sp = spf.newSAXParser();

    通过解析器对象得到一个XML的读取器:

           XMLReader xmlReader = sp.getXMLReader(); 

    设置读取器的事件处理器:

      xmlReader.setContentHandler(new MyContentHandler());
    
    5.3 使用dom4j解析xml

    DOM4j解析xml文件:

    创建解析器:SAXReader reader=new SAXReader();
    利用解析器读入xml文档:Document document=reader.read(new File(“input.xml”));
    获取文档的根节点:Element root=document.getRootElement();
    获取某个节点的子节点:Element element=ele.element(“书名”);
    获取节点名字:node.getName();
    设置节点的名字:node.setName(String newName)
    获取节点的文字(标签体):String text=node.getText();设置:node.setText(“中国”)
    添加子节点:ele.add(Element e);ele.addElement(“北京”)
    删除子节点:parentElm.remove(childElm);
    获取父节点:node.getParent();
    获取某节点对象的某属性:Attribute attr=ele.attribute(“中国”)
    在指定位置插入节点:得到插入位置的节点列表(list):List list=root.element(“书”).elements();
    调用list.add(1,aaa);
    获取属性的名、值:String name=attribute.getName();
    /**
         * 获取所有标签的文本值
         * @throws DocumentException
         */
        @Test
        public void readAllText() throws DocumentException {
            // 文件读取器
            SAXReader reader = new SAXReader();
            // 读取xml文件返回文档对
            Document document = reader.read("d:\\books.xml");
            //获得根标签(books)
            Element root = document.getRootElement();
            //通过根标签获得旗下所有子标签(book...)
            List<Element> bookList = root.elements();
            //遍历所有子标签(book...)
            for (Element book : bookList) {
                //得到所有子标签的子标签(name、author、price)
                List<Element> bookChilds = book.elements();
               //遍历所有子标签的子标签(name、author、price)
                System.out.println("**********************");
                for (Element bookChild : bookChilds) {
                    //打印出他们的名称和内容
                    System.out.print(bookChild.getName());
                    System.out.println(bookChild.getText());
                }
            }
    }

    6 xpath技术

    6.1 xpath技术介绍

    XPath 是一门在 XML 文档中查找信息的语言,基于XML的树状结构,提供在数据结构树中找寻节点的能力。

    表达式 描述 例子 例子描述
    nodename 选取此节点的所有子节点。 books 选取 books 元素的所有子节点。
    / 从根节点选取。 /books 选取根元素 books。
    books/book 选取属于 books 的子元素的所有 book 元素。
    // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 //book 选取所有 book 子元素,而不管它们在文档中的位置。
    books//book 选择属于 books 元素的后代的所有 book 元素,而不管它们位于 books 之下的什么位置。
    . 选取当前节点。
    .. 选取当前节点的父节点。
    @ 选取属性。 //@id 选取名为 id 的所有属性。
    6.2 xpath技术与dom4j技术结合

    导入相关jar包:dom4j-1.6.1\lib\jaxen-1.1-beta-6.jar

    /**
         * 使用xpath读取标签内容
         * @throws DocumentException
         */
        @Test
        public void readTagTextByXpath() throws DocumentException {
            // 文件读取器
            SAXReader reader = new SAXReader();
            // 读取xml文件返回文档对象
            Document document = reader.read("d:\\books.xml");
            //找寻name
            List<Node> list = document.selectNodes("//name");
           for (Node node : list) {
                System.out.println(node.getText());
            }
        }

    7 总结

    这里写图片描述

    发布了16 篇原创文章 · 获赞 1 · 访问量 948

    猜你喜欢

    转载自blog.csdn.net/jh_5935/article/details/80407853
    今日推荐