XML简单介绍

Posted 鬼王呵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
  • 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很容易解析出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:书架>
  • 注意:名称空间的名字语法容易让人混淆,尽管以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</售价>
    </>
</书架>

以上是关于XML简单介绍的主要内容,如果未能解决你的问题,请参考以下文章

(转)Dom4J解析

XSL-FO 和 XML:每页页眉中的圣经书名

我需要哪种亚马逊服务来简单查询书名、ISBN 和出版商?

java xml 写了一段代码 属性里的默认值出不来

web学习第三天

1、 求c语言程序图书登记管理程序。要求如下急!