zoukankan      html  css  js  c++  java
  • XML简介

    XML编程

    主要内容:

    • XML及其语法
    • XML约束之DTD
    • XML编程(CRUD - Create Read Update Delete)
    • XML约束之Schema

    XML概述

    什么是XML

    • XML是指可扩展标记语言(eXtensible Markup Language),他是一种标记语言,非常相似HTML,他被设计的宗旨是数据传输,而非显示数据。
    • XML标签没有被提前定义。须要用户自行定义标签。
    • XML技术是W3C组织(World Wide Web Consortium 万维网联盟)公布的,眼下遵循的是W3C组织于2000年公布的XML1.0规范。
    • XML被广泛觉得是继Java之后在Internet上最激动人心的心技术。

    XML技术用于解决什么问题

    • <中国><北京><丰台></丰台><海淀></海淀></北京><安徽><合肥></合肥><黄山></黄山></安徽></中国>
    • XML是一种通用的数据交换格式
    • 在XML语言中,他同意用户自己定义标签。一个标签用于描写叙述一段数据,一个标签可分为起始标签和结束标签,在标签之间,又能够使用其它标签描写叙述其它数据,以此来实现数据关系的描写叙述。
    • XML中的数据必须通过软件程序来解析运行或显示。如IE,这样的解释程序表示Parser解释器。

    XML常见的应用

    • 在Java开发中。传统的配置文件是*.properties属性文件(key=value),而XML表示的数据更为丰富。

    • XML技术除用于描写叙述有关系的数据外,还经经常使用作配置文件,以描写叙述程序模块之间的关系。

      (后面学习的Struts、Spring、Hibernate都是基于XML作为配置文件的)

    • 在一个软件系统中,通过XML配置文件能够提高系统的灵活性。即程序的行为是通过XML文件来配置的,而不是硬编码。

    XML语法

    XML文档的组成

    • 文档声明
    • 元素
    • 元素的属性
    • 凝视
    • CDATA区
    • 特殊字符
    • 处理指令(PI:Processing Instruction)

    文档声明

    • 在编写XML文档时,须要先使用文档声明来声明XML文档,且必须出如今文档的第一行。
    • 最简洁的语法:

    元素

    • XML元素指XML文件里出现的标签、一个标签分为起始标签和结束标签(不能省略)。

      一个标签有例如以下书写形式:

      • 包括标签主体:<mytag>context</mytag>
      • 不含标签主体:<mytag/>
    • 一个标签中能够嵌套若干子标签,可是全部标签必须合理的嵌套。不同意有交叉嵌套。
    • 一个XML文档必须有且仅有一个跟标签,其它标签都是这个跟标签的字标签或孙标签。
    • XML中不会忽略主体中的换行与空格。
    • 元素命名规范(元素[标签]的名称能够包括字母、数字、减号、下划线和英文句点):
      • 严格区分大写和小写:<P> <p>
      • 仅仅能以字母或下划线开头: abc _abc
      • 不能以xml(或XML、Xml等)开头—W3C保留日后使用;
      • 名称字符之间不能有空格或制表符;
      • 名称字符之间不能使用冒号;(有特殊用途)

    特殊字符

    • 对于一些特殊字符,若要在元素主体内容中显示,必须进行转移。
      • & –> &amp;
      • < –> &lt;
      • > –> &gt;
      • ” –> &quot;
      • ’ –> &apos;

    凝视

    • 凝视: <!-- 这是凝视信息 -->
    • 凝视不能加在文档声明之前。

    处理指令

    • 处理指令。简称PI(Processing Instruction)。
    • 作用:用来指挥软件怎样解析XML文档。
    • 语法:必须以”

    XML约束之DTD

    为什么须要约束

    • XML都是用户自己定义的标签,若出现小小的错误,软件程序将不能正确地获取稳健中的内容而报错。

    • XML技术中。能够编写一个文档来约束一个XML的书写规范,这个文档称之为约束。

    • 两个概念:
      • 格式良好的XML:遵循XML语法的XML
      • 有效的XML:遵循约束文档的XML
        约束文档定义了在XML中同意出现的元素名称。属性及元素出现的顺序等等。

    常见的约束技术

    • XML DTD [*]
    • XDR
    • SOX
    • XML Schema [*]

    DTD高速入门

    • DTD(Document Type Definition):文档类型定义。
    • 作用:约束XML的书写规范

    编写DTD的方式

    • DTD约束文档能够再XML文档中直接定义。也能够作为单独的文档进行编写(单独的文档必须以UTF-8编码进行保存)。
    • 在XML文档中编写DTD演示样例:
    <?xml version="1.0" encoding="GBK" standalone="yes"?>
    <!DOCTYPE 书架 [
        <!ELEMENT 书架 (书+)>
            <!ELEMENT 书 (书名,作者,售价)>
            <!ELEMENT 书名 (#PCDATA)>
            <!ELEMENT 作者 (#PCDATA)>
            <!ELEMENT 售价 (#PCDATA)>
        ]
    >
    <书架>
        <>
            <书名>JavaWEB开发</书名>
            <作者>小三</作者>
            <售价>45.90</售价>
        </>
    </书架>
    • 引入外部DTD文档(XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种方式:)
      • 当引用的DTD文档在本地时。採用例如以下方式:
        <!DOCTYPE 根元素 SYSTEM "DTD文档路径">
    
        如:<!DOCTYPE 书架 SYSTEM "book.dtd">
    • 当引用的DTD文档在公共网络上时。採用例如以下的方式:
        <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
    
        如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun/com/dtd/web-app_2_3.dtd">
    • 举例:在XML中引用book.dtd文件演示样例
      • book.dtd文件
    <!ELEMENT 书架 (书+)>
        <!ELEMENT 书 (书名,作者,售价)>
        <!ELEMENT 书名 (#PCDATA)>
        <!ELEMENT 作者 (#PCDATA)>
        <!ELEMENT 售价 (#PCDATA)>
    • book.xml文件引用book.dtd文件
    <?xml version="1.0" encoding="GBK"?>
    <!DOCTYPE 书架 SYSTEM "book.dtd">
    <书架>
        <>
            <书名>JavaWEB开发</书名>
            <作者>小三</作者>
            <售价>45.90</售价>
        </>
        <>
            <书名>C/C++开发</书名>
            <作者>小四</作者>
            <售价>43.00</售价>
        </>
    </书架>

    DTD语法细节

    • DTD文档的语法主要涉及下面内容的定义
      • 定义元素
      • 定义属性
      • 定义实体

    DTD-定义元素

    • 在DTD文档中使用ELEMENT关键字来声明一个XML元素
    • 语法:

    DTD-定义属性 ###

    • 在DTD文档中使用ATTLIST关键字来为一个元素声明属性。
    • 语法:
        <!ATTLIST 元素名
            属性名1 属性值类型 设置说明
            属性名2 属性值类型 设置说明
            ......  
        >

    演示样例:

        <!ATTLIST 商品
            类别 CDATA #REQUIRED
            颜色 CDATA #IMPLIED
        >

    则相应的XML为:<商品 类别=”服装” 颜色=”黄色”/>

    • 属性值类型:
      • CDATA:表示属性的取值为普通的文本字符串
      • ENUMERATED(DTD没有此关键字):表示枚举,仅仅能从枚举列表中任选其一。如(鸡肉|牛肉|猪肉|鱼肉)
      • ID:表示属性的取值不能反复,唯一性
    • 设置说明
      • #REQUIRED:表示属性必须出现
      • #IMPLIED:表示该属性可有可无
      • #FIXED:表示属性的取值为一个固定值。语法:#FIXED “固定值”
      • 直接值:表示属性的取值为该默认值

    演示样例一:

        <!ATTLIST 页面作者
            姓名 CDATA #IMPLIED
            年龄 CDATA #IMPLIED
            联系信息 CDATA #REQUIRED
            站点职务 CDATA #FIXED "页面作者"
            个人爱好 CDATA "上网"
        >

    演示样例二:

        <?

    xml version="1.0" encoding="GBK" standalone="yes"?> <!DOCTYPE 购物篮 [ <!ELEMENT 肉 EMPTY> <!ATTLIST 肉 品种 (鸡肉|牛肉|猪肉|鱼肉) "鸡肉"> ]> <购物篮> < 品种="鱼肉"/> < 品种="牛肉"/> </> </购物篮>

    DTD-定义实体

    • 定义实体就是为一段内容指定一个名称。使用时通过这个名称就能够引用其所代表的内容。

    • 在DTD文档中使用ENTITY关键字来声明一个实体。
    • 实体课分为:引用实体和參数实体。两者的语法不通。

    定义引用实体

    • 概念:在DTD中定义,在XML中使用
    • 语法:
        DTD中定义:
            <!ENTITY copyright "易则版权全部">
        XML中引用:
            &copyright;

    定义參数实体

    • 概念:在DTD中定义,在DTD中使用
    • 语法:
        DTD中定义:
            <!ENTITY % TAG_NAMES "姓名|EMAIL|电话|地址">
        DTD中引用:
            <!ELEMENT 个人信息 (%TAG_NAMES;|生日)>
            <!ELEMENT 客户信息 (%TAG_NAMES;|公司名)>

    解析XML文档

    Java 解析XML概述

    • XML解析方式分为两种:DOM方式和SAX方式
      • DOM:Document Object Model,文档对象模型。

        这样的方式是W3C推荐的处理XML的一种方式。

      • SAX:Simple API for XML,这样的方式不是官方标准,属于开源社区的XML-DEV。差点儿全部的XML解析器都支持它。
    • XML解析开发包
      • JAXP:是SUN公司推出的解析标准实现,JDK。 *
      • Dom4J:是开源组织推出的解析开发包。(大家都在使用)*
      • JDom:是开源组织推出的解析开发包。

    JAXP

    • JAXP(Java API for XML Processing)开发包是JavaSE的一部分,它是由几个包及其自爆组成:
      • org.w3c.dom:提供DOM方式解析XML的标准接口
      • org.xml.dom:提供SAX方式解析XML的标准接口
      • javax.xml:提供了解析XML文档的类
    • javax.xml.parsers包中,定义了几个工厂类。能够通过调用这些工厂类,得到对XML文档进行解析的DOM和SAX解析器对象。


      • DocumentBuilderFactory
      • SAXParserFactory

    注:

    • DOM缺点:一次性将文档载入到内存中,假设xml文档比較大。占用的内存就会多(64M–Java)。
    • Document代表内存中的整个DOM树。
    • 长处:查找、改动、删除

    JAXP操作文档两点注意点

    1. 获取Document对象
      • javax.xml.parsers包中的DocumentBuilderFactory用于创建DOM模式的解析器对象,DocumentBuilderFactory是一个抽象工厂类,他不能直接实例化,单该类提供了一个newInstance方法。这种方法会依据本地平台默认安装的解析器,自己主动创建一个工厂的对象并返回。

    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    1. 更新XML文档(在程序中操作更新的是在内存中,XML文档在磁盘中并没有更新)
      • javax.xml.transform包中的Transformer类用于把代表XML文件的Doucment对象转换为某种格式后进行输出。比如把xml文件应用样式表后转成html文档。利用这个对象,当然也能够把Document对象又又一次写入到一个XML文件里。
      • Transformer类通过transform方法完毕转换操作,该方法接受一个源和一个目的地。

        我们能够通过:

      • javax.xml.transform.dom.DoMSource类来关联要转换的document对象。

      • 用javax.xml.transform.stream.StreamResult对象来表示数据的目的地。
      • Transformer对象通过TransformerFactory获得。
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer =  transformerFactory.newTransformer();
    transformer.transform(new DOMSource(document), new StreamResult("src/book.xml"));

    SAX

    • 在使用DOM解析XML文档时。须要读取整个XML文档。在内存中构架代表整个DOM书的Document对象,从而在对XML文档进行操作。此种情况下,假设XML文档特别大。就会消耗计算机的大量内存,而且easy导致内存溢出。
    • SAX解析同意在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

    • SAX採用时间处理的方式解析XML文件。利用SAX解析XML文档。设计两个部分:解析器和事件处理器:
      • 解析器能够使用JAXP的API创建,创建出SAX解析器后。就能够指定解析器去解析某个XML文档。
      • 解析器採用SAX方式在解析某个XML文档时。它仅仅要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法。解析器在调用事件处理器的方法时。会把当前解析到的xml文件内容作为方法的參数传递给事件处理器。
      • 事件处理器由程序猿编写,程序猿通过事件处理器中方法的參数。就能够非常轻松地得到sax解析器解析到的数据,从而决定怎样对数据进行处理。
    • 演示样例
    public static void main(String[] args) throws Exception {
    
            // 获取解析器
            SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
            // 得到读取器
            XMLReader xmlReader = saxParser.getXMLReader();
            xmlReader.setContentHandler(new DefaultHandler() {
    
                int index = 0; //售价索引
                boolean isPrice = false; //是否是售价
    
                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                    if ("售价".equals(qName)) {
                        isPrice = true;
                    }
                 }
    
                @Override
                public void characters(char[] ch, int start, int length) throws SAXException {
                    if (index == 1 && isPrice) {
                        System.out.println(new String(ch, start, length));
                    }
                }
    
                @Override
                public void endElement(String uri, String localName, String qName) throws SAXException {
                    if ("售价".equals(qName)) {
                        isPrice = false;
                        index++;
                    }
                }
            });
            xmlReader.parse("sax/src/book.xml");
        }

    DOM4J解析XML文档

    • Dom4j是一个简单、灵活的开放源码的库。Dom4j是由早起开发JDOM的人分离出来而后独立开发的。与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,单它提供了比JDOM更好的灵活性。
    • Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。如今非常多软件採用的Dom4j,比如Hibernate、包括sun公司自己的JAXM也用了Dom4j。
    • 使用Dom4j开发。许下载Dom4j相应的jar文件。
    • 參考Dom4j-1.6.1 API文档
    • 演示样例
    public void getNodeTextContent() throws Exception {
    
        //1 得到解析器
        SAXReader saxReader = new SAXReader();
        //2 载入xml文档
        Document document = saxReader.read("src/book.xml");
        //3 获取根元素
        Element root = document.getRootElement();
        //4 得到第二本书元素
        Element book = (Element) root.elements("书").get(1);
        Element bookName = book.element("书名");
        Assert.assertEquals("C/C++开发", bookName.getText());
    }

    XML约束之Schema

    • XML Schema也是一种用于定义和描写叙述XML文档与内容的模式语言,其出现时为了克服DTD的局限性。
    • XML Schema本身就是一个XML文档。
    • XML Schema VS DTD:
      • XML Schema符合XML语法结构。
      • DOM、SAX等XML API非常easy解析出XML Schema文档中内容。
      • XML Schema对名称空间支持得非常好。

      • XML Schema比XML DTD支持很多其它的数据类型,并支持用户自己定义新的数据类型。
      • XML Schema定义约束的能力非常大。能够对XML实例文档作出仔细的语义限制。
      • XML Schema不能像DTD一样定义实体。比DTD更复杂,但XML Schema如今是W3C的标准。它正在逐步代替DTD。

    XML Schema高速入门

    • XML Schema文件自身就是一个XML文件,但它的扩展名通常为.xsd。
    • 一个XML Schema文档通常称之为模式文档(约束文档)。遵循这个文档书写的xml文件称之为实例文档。
    • 和XML文件一样。一个XML Schema文档也必须有一个根节点,但这个根节点的名称为schema。

    • 编写了一个XML Schema约束文档后,通常须要把这个文件里声明的元素绑定到一个URI地址上。在XML Schema技术中有一个专业术语描写叙述这个过程。即把XML Schema文档声明的元素绑定到一个名称空间上。以后XML文件就能够通过这个URI(即名称空间)来告诉解析引擎,xml文档编写的元素来自哪里,被谁约束。
    • xsd演示样例:
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.hsx.com"
        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演示样例:
    <?xml version="1.0" encoding="UTF-8"?>
    <hsx:书架 xmlns:hsx="http:www.hsx.com"
        xmlns:xi="http://www.w3.org/2001/XMLSchema-instance"
        xi:schemaLocation="http://www.hsx.com book.xsd">
        <hsx:书>
            <hsx:书名>Java AOP</hsx:书名>
            <hsx:作者>黄泽</hsx:作者>
            <hsx:售价>50</hsx:售价>
        </hsx:书>
    </hsx:书架>

    名称空间的概念

    • 在XML Schema中,每一个约束模式文档都能够被赋予一个唯一的名称空间。名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。

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

    <hsx:书架 xmlns:hsx="http:www.hsx.com"
        xmlns:xi="http://www.w3.org/2001/XMLSchema-instance"
        xi:schemaLocation="http://www.hsx.com book.xsd">
        <hsx:书>
            <hsx:书名>Java AOP</hsx:书名>
            <hsx:作者>黄泽</hsx:作者>
            <hsx:售价>50</hsx:售价>
        </hsx:书>
    </hsx:书架>
    • 注意:名称空间的名字语法easy让人混淆,虽然以http://開始。哪个URI并不指向一个包括模式定义的文件。其实,这个URL:http://www.hsx.com根本没有指向不论什么文件。仅仅是一个分配的名字。

    使用名称空间引入Schema

    • 为了在一个XML文档中声明它所遵循的Schema文件的详细为止。通常须要在XML文档中的根节点中使用SchemaLocation属性来指定。比如:
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    • schemaLocation此属性有两个值。

      第一个是值是须要使用的命名空间;第二个值是供命名空间使用的XML Schema的位置,两者之间用空格分隔。

    • 注意:在使用schemaLocation属相时,也须要指定该属性来自哪里。

    使用默认名称空间

    • 基本格式:xmlns="URI"
    • 演示样例:
    <?

    xml version="1.0" encoding="UTF-8"?> <书架 xmlns="http:www.hsx.com" xmlns:xi="http://www.w3.org/2001/XMLSchema-instance" xi:schemaLocation="http://www.hsx.com book.xsd"> <> <书名>Java AOP</书名> <作者>黄泽</作者> <售价>50</售价> </> </书架>

    使用名称空间引入多个XML Schema文档

    • 演示样例:
    <?

    xml version="1.0" encoding="gbk"?

    > <shiporder xmlns="http://www.itcast.cn" xmlns:xi="http://www.w3.org/2001/XMLSchema-instance" xi:schemaLocation="http://www.itcast.cn shiporder.xsd" orderid="aaaa"> <orderperson>aaa</orderperson> <shipto> <name>zhangsan</name> <address>sd</address> <city>jn</city> <country>cn</country> </shipto> <item> <title>aaaaa</title> <note>bbbb</note> <quantity>10</quantity> <price>100.0</price> </item> </shiporder>

    不使用名称空间引入XML Schema文档

    • noNamespaceSchemaLocation
    • 演示样例:
    <?xml version="1.0" encoding="UTF-8"?>
    <书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="book.xsd">
        <>
            <书名>Java编程思想</书名>
            <作者>黄泽</作者>
            <售价>59.00</售价>
        </>
    </书架>
  • 相关阅读:
    ssh-keygen Linux 免密登录
    hostnamectl 修改 CentOS7 主机名
    微信公众平台开发—24点游戏
    微信公众平台开发—起步
    java的静态代理和动态代理(jdk、cglib)
    UEditor上传图片到七牛云储存(java)
    第四十篇-private,public,protected的区别
    第七篇--ubuntu18.04下面特殊符号
    6. 计算器界面
    第六篇--Ubuntu画图软件
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8340660.html
Copyright © 2011-2022 走看看