首页 > 代码库 > XML基础

XML基础

XML基础


【XML定义】
 XML的全称是Extensible Markup Language, 即可扩展标记语言; 它是独立于软件和硬件的信息传输工具,用来解决EDI(电子数据交换)所面对的问题的独立标记语言,与平台和语言无关。
我们还需要注意的两个问题:

[什么是可扩展标记语言?]

可扩展标记语言是一种很像超文本标记语言的标记语言。
它的设计宗旨是传输数据,而不是显示数据。
它的标签没有被预定义。您需要自行定义标签。
它被设计为具有自我描述性。
它是W3C的推荐标准。

[可扩展标记语言和超文本标记语言之间的差异]

它不是超文本标记语言的替代而是对超文本标记语言的补充。
它和超文本标记语言为不同的目的而设计:它被设计用来传输和存储数据,其焦点是数据的内容;超文本标记语言被设计用来显示数据,其焦点是数据的外观。
超文本标记语言旨在显示信息,而它旨在传输信息。
对它最好的描述是:它是独立于软件和硬件的信息传输工具。


【XML历史】
如图:技术分享


【XML特点】

1、W3C组织提出的标准,从SGML(标准通用标识语言 )衍生出来的简化版本
2、XML标记描述了文档内容的结构和语义,而不是内容的格式。格式是在另外的样式单中描述的
3、XML是用编辑器创建的,由语法分析程序来读取,而由浏览器来显示的
4、标记需要自己去创建!一个最大的特殊处(与HTML不同处),它可以创建标签,包括使用中文标签
5、语法更严格!标签必需成对嵌套,并且属性必须有属性值,属性值也必须包含在引号中
6、XML仅仅用来存储数据,不包含与数据显示相关的样式信息(这部分信息可以通过CSS等语言来传递),XML是具有语义的
7、优点:较灵活,可以自定义标记、跨软硬件平台及语言,数据以文本格式存储


【XML用途】

XML应用于web开发的许多方面,常用于简化数据的存储和共享。
1. XML把数据从HTML中分离,XML用于存储数据,HTML用于页面布局和显示数据;
2. XML简化数据共享,以纯文本格式存储,提供了独立于软件和硬件的数据存储方法;
3. 简化数据传输,在不兼容的系统之间轻松交换数据;
4. 简化平台的变更,更容易扩展或升级到新的操作系统、应用程序或浏览器;
5. 使数据更有用,独立于硬件、软件以及应用程序;
6. 用于创建新的Internet语言,如WSDL,RSS,WAP,RDF等;
如图:技术分享

【XML的作用】
XML作用一:数据交换,如图:技术分享
XML作用二:一种数据多种显示,如图:技术分享
XML作用三:数据分布式处理,如图:技术分享

【XML示例】

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE catalog SYSTEM "catalog.dtd"><!-- catalog last updated 2000-11-01 --><catalog xmlns="http://www.example.com/catalog/">   <book id="bk101">      <author>Abercrombie, Kim</author>      <title>XML Developer‘s Guide</title>      <genre>Computer</genre>      <price>44.95</price>      <publish_date>2000-10-01</publish_date>      <description><![CDATA[An in-depth look at creating applications with XML, using <, >, ]]></description>    </book></catalog>


【XML的基本结构】
XML的基本结构基本分三部分:
    1、XML声明
检查XML文档是否合格,必须部分。不可缺省。
格式示例: <?xml version="1.0" encoding="GB2312" ?>
    2、处理指令
用于给处理XML文档的应用程序提供信息。
格式:<?处理指令名 处理指令信息?>
    3、XML元素
是描述XML文档内容的基本单元。
它具有的特点有:语法要求严格; 所有元素具一对闭合标记; 大小写敏感; 嵌套对应(一个XML文件仅有一根元素标记。其余元素都嵌套于根中,且一一对应)

下面来详细介绍每个部分:
[XML声明]

例:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

XML声明一般是XML文档的第一行
XML声明由以下几个部分组成:
  version - -文档符合XML1.0规范,目前只有1.0规范(version是属性,属性值必须用双引号或者单引号括起来,后面的也一样)
  encoding - -文档字符编码,默认是UTF-8,当然还可以是gb2312、BIG5等字符集编码
  standalone - -文档定义是否在一个文件内
      standalone="yes"
      standalone="no"
[处理指令]

简称PI( processing instruction ) 。处理指令用来之后解析引擎如何解析XML文档内容。
例如在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
  <?xml-stylesheet type="text/css" href="http://www.mamicode.com/1.css"?>
  处理指令必须以“<?”作为开头,以“?>”作为结尾
  XML声明语句就是最常见的意志处理指令。
注意:<?前后不能有空格,后面跟的xml是处理指令表示此文件以xml格式处理

[XML元素]
在讲XML元素之前,我们不得不知道的是XML节点
XML是一些节点的集合,由于文档中可能包含有不同类型的信息,所以定义了几种不同类型的节点。XML中最常见的节点类型有:
  元素:元素是XML的基本构件。元素的子节点可以是其它元素、文本节点或两者都有。元素节点还可以只含有属性这一唯一类型的节点
  属性:属性节点包含关于元素节点的信息,但它不是元素的子节点
  文本:文本节点文本信息,或干脆是空白的文本
  文档:文档节点是整个文档中所有其它节点的父节点

XML元素:
规则:
    1、XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有两种书写形式:包含标签体<a>abcd</a>, 不含标签体<a/>
    2、一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,绝不允许相互嵌套(例如 A中有B,在A结束标签前,B标签必须已经在A内部结束);
    3,格式良好的XML文档必须有且仅有一个根标签,其他表示都是这个根标签的子孙标签。对于XML中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。
        例如:下面两段内容是不一样的。
                第一段:<国家>China</国家>
                第二段:    <国家>
                     China
                 </国家>
       由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式让原文件中的内容清晰可读的”良好“书写习惯可能被迫改变。
    4,一个XML元素可以包含字母,数字,以及其他一下可见字符,但必须遵守下面的一些规范:
      区分大小写;
      不能以数字或”_“ (下划线)开头;
      不能以xml(或XML,Xml等)开头;
      不能包含空格。
      名称中间不能包含冒号(注:冒号留给命名空间使用)

元素之间的关系:子元素/父元素、祖先/后代
元素内容的类型:嵌套元素/字符数据/实体引用/ CDATA节/处理指令/注释

XML根元素:
每个XML文档必须有且只有一个根元素。
根元素是一个完全包括文档中其他所有元素的元素。
根元素的起始标记要放在所有其他元素的起始标记之前。
根元素的结束标记要放在所有其他元素的结束标记之后。

[补充]
一、元素和标签的异同点:
1.相同点,看上去都是<xxx>和</xxx>的一对组合;
2.不同点,书写方式不同,标签一般是

<根标签>    <标签>    ...    </标签></根标签>

而元素是:

<根标签>    <标签1>        <元素1>abcd</元素1> <!--可以看出相对于标签,缩进都深一层-->        <元素2>1234</元素2>        ...    </标签1>    <标签2>    ...    </标签2></根标签>

3.逻辑表达含义不同,从上面代码看,元素1和元素2是属于标签1,标签1是根标签的子标签,标签1和标签2是兄弟关系。
4.标签可以拥有属性,而元素不具有,例如:

<根标签>    <标签1 属性1 = "某个值"> <!--这里一定要加双引号-->        <元素1>abcd</元素1> <!--可以看出相对于标签,缩进都深一层-->        <元素2>1234</元素2>        ...    </标签1></根标签>

二、关于属性,需要注意的是:
  属性值用双引号(“)或单引号(‘)分隔

<location name="foodoir"> #属性值可以双引号括起来<location name=‘foodoir‘> #当然也可以单引号括起来<location name=‘foodoir "hello" world‘> #如果文本内容本身包含双引号,可用单引号来括起来<location name="foodoir "hello" world"> #"代表双引号,相当于转义字符一样

  一个元素可以有多个属性,它的基本格式为:
  <元素名 属性名="属性值">
  特定的属性名称在同一个元素标记中只能出现一次
  属性值不能包括<, >, &
  另外:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述(属性封装或子元素封装),例如:

      <input>        <name>text</name>    </input>


三、关于CDATA节:
  用于把整段文本解释为纯字符数据而不是标记的情况。包含大量<、>、&或者"字符。CDATA节中的所有字符都会被当作元素字符数据的常量部分,而不是XML标记。
  在编写XML文件时,有些内容可能不想让解析引擎执行解析执行,而是当中元素内容处理。这种情况可以吧这些内容放到CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是执行原封不动的输出。
    语法:
      <![CDATA[
    …………
      ]]>
可以输入任意字符(除]]>外),不能嵌套,常用于在CDATA中写SQL语句,使SQL语句脱离程序的绑定,例如:

<![CDATA[        <itcast>                <br/>        </itcast>    ]]>

四、XML注释
<!--注释的内容-->
注释内容中不要出现--;
不要把注释放在标记中间,比如:<name <!--it‘s name-->>foodoir</name>;
注释不能嵌套

五、XML特殊字符
&    &amp
>    &gt
<    &lt
"    &quot
‘    &apos

【XML文档的结构描述】
XML文档的结构是类似于目录树结构。
存储产品数据的XML文档的结构描述如下图 :技术分享

一个格式正规的XML文档应该遵循如下规则的XML文档称为格式正规的XML文档:
语法规范; 必须有XML声明语句 ;必须有且仅有一个根元素; 标记大小写敏感; 属性值用引号; 标记成对; 空标记关闭; 元素正确嵌套

【XMl约束概述】
在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。常用的约束技术:XML DTD 和 XML Schame
下面我们针对DTD和Schame做详细了解
[DTD]
一、文档类型定义(DTD)
  DTD定义了XML文档内容的结构,允许以一致的格式存储数据。
  一项文档类型定义应规定元素清单、属性、标记、文档中的实体及其相互关系。DTD为文档结构制定了一套规则。
  XML允许为应用程序创建自己的DTD。
  可以依据DTD来检查XML文档。这种检查过程被称为验证。与DTD相符合的XML文档被认为是有效的文档。DTD是"有效XML文档"的必须文件,我们通过DTD文件来定义文档中元素和标识的规则及相互关系。
二、DTD语法简介
  在DTD中,使用下面的语法声明元素:
  <!ELEMENT elementname (content-type or content-model)>
  元素有下列类型:
  Empty Unrestricted Container
  在DTD中声明元素的时候,不同的符号用来指定一个元素是强制的还是可选择的和它是否将会多次出现。
三、确定验证数据结构的方法
  为了使存储在XML文档中的数据的结构对于DTD是有效的,需要使用解析器。
  解析器是检查XML文件中所使用语法的软件程序。解析器有两种类型。它们是:  
  非确认解析器:检查文档是否遵循XML语法规则。
  确认解析器 :检查XML文档的形式良好性与有效性。
四、DTD有关的术语
  1.Schema(规划)
    schema是数据规则的描述。schema做两件事:
      a.它定义元素数据类型和元素之间的关系;
      b.它定义元素所能包含的内容类型。
    DTD就是关于XML文档的一个schema。
  2.Document Tree(文档树)
    它是文档元素分级结构的形象表示。一个文档结构树包含根元素,根元素是最顶级的元素,(就是紧接着XML声明语句后的第一个元素)。

<?xml version="1.0"?><filelist><myfile><title>...</title><author>...</author></myfile></filelist>

    上面的例子分三级结构排列成“树”状,其中的<filelist>就是根元素。在XML和DTD文件中,第一个定义的都是根元素。
  3.Parent Element(父元素)/Child Element(子元素)
    父元素是指包含有其它元素的元素,被包含的元素称为它的子元素。看上面的“结构树”,其中<myfile>是父元素,<title>,<author>是它的子元素,而<myfile>又是<filelist>的子元素。象<title>这样没有包含任何子元素的最后一级元素我们也称之为“页元素”。
  4.Parser(解析软件)
    Parser是一种检查XML文档是否遵循DTD规范的工具软件。
    XML的parser发展为两类:一种是“非确认类paeser”,只检测文档是否遵守XML语法规则,是否用元素标识建立了文档树。另一种是“确认类paeser”,它不但检测文档语法,结构树,而且比较解析你使用的元素标识是否遵守了相应DTD文件的规范。
    Parser能独立使用,也可以成为编辑软件或浏览器的一部分。

    关于DTD下面我们来看一个例子:

//1.将下面文件存为myfile.dtd<!ELEMENT myfile (title, author)><!ELEMENT title (#PCDATA)><!ELEMENT author (#PCDATA)>//2.然后建立XML文档myfile.xml:<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!DOCTYPE myfile SYSTEM "myfile.dtd"><myfile><title>XML轻松学习手册</title><author>ajie</author></myfile>//3.建立HTML文档myfile.html<!DOCTYPE html><html>	<head>		<meta charset="UTF-8">		<title></title>		<script language="JavaScript" for="window" event="onload">			var xmlDoc = new			ActiveXObject("Microsoft.XMLDOM");			xmlDoc.async = "false";			xmlDoc.load("myfile.xml");			nodes = xmlDoc.documentElement.childNodes;			title.innerText = nodes.item(0).text;			author.innerText = nodes.item(1).text;		</script>	</head>	<body bgcolor="#FFFFFF">		<b>标题: </b>		<span id="title"></span><br>		<b>作者: </b>		<span id="author"></span><br>	</body></html>//4.用浏览器打开myfile.html就可以看到效果了。

五、DTD缺陷
DTD本身不是一个xml,不能被直接校验;不能表示数据类型; 无法有效处理重名的元素; 无法定义更多的元素规则

[Schame]
一、关于XML Schema
  XML Schema是一个基于XML的语法或schema规范,用来定义XML文档的标记方式( XML Schema的文件是以.xsd结尾,符合xml语法结构)。XML Schema是一个由Microsoft建议的schema规范,它与文档类型定义(DTD)相比具有很大的优势,而DTD是最初用来定义XML模型的schema规范。DTD存在很多缺点,包括使用非XML语法,不支持数据类型定义,不具有扩展性等。例如,DTD不允许把元素内容定义为另外一个元素,或字符串。想了解更多有关DTD的内容,可以参考W3C XML建议书。 XML Schema从几个方面改善了DTD,包括使用XML语法,支持数据类型定义和名域。例如,XML Schema允许你把一个元素说明为一个integer, float,Boolean, URL等类型。  在Internet Explorer 5中的XML解析器可以解析使用DTD或XML Schema的XML文档。
  XML Schema提供了比DTD更细粒度的数据类型来验证xml,schema它本身也是xml文件,而dtd不是,既然schema是xml文件,那schema是谁来验证呢?显然是dtd。所以我们经常看到Schema文件的开头都会引入 xmlns:xs="http://www.w3.org/2001/XMLSchema",而命名空间xs所绑定的地址就是用来schema的dtd文件,这是固定格式
二、如何建立XML Schema
  请在下面的XML文档中找一找每个节点的schema声明。

  <class xmlns="x-schema:classSchema.xml">      <student studentID="13429">         <name>Hello World</name>           <GPA>3.8</GPA>      </student>  </class> 

  注意到在上面文档中默认的名域是“x-schema:classSchema.xml”。这告诉解析器  根据URL(“classSchema.xml”)上的schema(x-schema)来解析整个文档。
  下面是上面那个文档的完整的schema。注意schema的根元素中的名域声明。第一个(xml ns=”urn:schemas-microsoft-com:xml-data”)表明这个XML文档是一个XML Schema。第二个(xmlns:dt=”urn:schemas-microsoft-com:datatypes”)允许schema处理者在Elem  entType和AttributeType声明中的type属性前加dt前缀来说明元素的类型和内容的特征。

<Schema  xmlns="urn:schemas-microsoft-com:xml-data"  xmlns:dt="urn:schemas-mi crosoft-com:datatypes">    <AttributeType name=‘studentID‘  dt:type=‘string‘  required=‘yes‘ />    <ElementType name=‘name‘  content=‘textOnly‘>    <ElementType name=‘GPA‘  content=‘textOnly‘  dt:type=‘float‘ />    <ElementType name=‘student‘  content=‘mixed‘>        <attribute type=‘studentID‘ />        <element type=‘name‘ />        <element type=‘GPA‘ />    </ElementType>    <ElementType name=‘class‘  content=‘eltOnly‘>        <element type=‘student‘ />    </ElementType></Schema>

三、定义元素和属性的声明元素
  1、ElementType 把类型和条件赋给一个元素,可以包含子元素
  2、AttributeType 把类型和条件赋给一个属性
  3、attribute 声明以前定义过的属性类型可以出现在名为ElementType的元素的作用域中
  4、element 声明以前定义过的元素类型可以出现在名为ElementType的元素的作用域中
  5、Schema的内容以最深层的元素的“AttributeType”和“ElementType”声明开头。 示例如下:
  <AttributeType name=‘studentID‘  dt:type=‘string‘  required=‘yes‘ />
  <ElementType name=‘name‘  content=‘textOnly‘>
  <ElementType name=‘GPA‘  content=‘textOnly‘  dt:type=‘float‘ /> ElementType声明后接着就是它的属性和子元素,如果一个元素有属性或子元素,必须把这种方法包含在它的ElementType声明中,或者是必须在它们自己的 ElementType 或 AttributeType声明中进行前导声明。
  <ElementType name=‘student‘  content=‘mixed‘>
      <attribute type=‘studentID‘ />
      <element type=‘name‘ />
      <element type=‘GPA‘ />
  </ElementType>
  6、不同于DTDs,XML Schema允许有一个开放的内容模式,可进行定义数据类型、使用默认值等等操作而不必限定内容。  在下面的schema中,<GPA> 元素的类型被定义并有一个默认值,但 <student> 元素中没有其他节点被声明。
四、XML Schema缺陷
  不能像DTD那样定义实体,比较复杂

【XML的解析】
一、XML解析技术有三种:DOM、SAX、STAX
     1、DOM :(Document Object Model 即对文章对象模型)是W3C组织推荐处理XML的一种方式。
     DOM思想:将整个xml 加载内存中,形成文档 树结构对象,所有对xml操作都对内存中文档 树结构对象进行。
    DOM 是官方xml解析标准。
    DOM是所有所有开发语言都支持的。
    DOM解析XML的每个元素都会变成对象(“文档对象模型”方式,解析完XML将生产一个树状结构的对象),并且按照XML文档关系建立起对象的关系,DOM中整个XML文档是Document对象来表示,用Element表示标签对象属性解析成attribute对象。DOM解析方式是预先将整个XML文档全部节点加载到内存中,然后进行读取。并且可以对XML文档进行增删查改。如果文件比较大,则加载速度慢,并且加载过后极易导致内存溢出。
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = dbf . newDocumentBuilder ();
        Document doc = builder . parse ( xmlPath ) ;
        //得到doc后获取节点集合
        NodeList  list = doc . getElementsByTagName ( "message" );
        //获取每一个节点内的信息;
        Node node = list . item( 0 );
        String msg = note . getFirstChild() . getNodeValue();
    关于Javascript中的DOM,这里不做详细解释,详细信息请移步到相关网站或链接
    2、SAX(Simple API for XML,XML简单API)
        为什么发明sax解析方式?当xml 文档非常大,不可能将xml所有数据加载到内存。
        SAX 思想:一边解析 ,一边处理,一边释放内存资源 ---- 不允许在内存中保留大规模xml 数据
        SAX 不是官方标准 ,但他是XML社区的标准,几乎所有XML解析器都支持他。SAX的解析规则是按行对XML文档进行解析,读取一行,解析一行。解析速度比较快,但是也仅仅只能对文档进行读取,并不支持修改。
    3、STAX(The Stream API for XML,XML流API)
        JDK6的新特性STAX是JDK6.0中除了DOM和SAX之外的又一种拉模式处理XML文档的API,其思想和SAX相似。
        STAX 是一种 拉模式 xml 解析方式,SAX 是一种 推模式 XML 解析方式。
            推push模式:由服务器为主导,向客户端主动发送数据。
            拉pull模式: 由客户端为主导,主动向服务器申请数据。
    4、关于这三种技术的比较:
         1. DOM(Document Object Model)
          DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
        优点:
              ①允许应用程序对数据和结构做出更改。
              ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
        缺点:
              ①通常需要加载整个XML文档来构造层次结构,消耗资源大。
        2. SAX(Simple API for XML)
            SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。
            选择DOM还是选择SAX? 对于需要自己编写代码来处理XML文档的开发人员来说, 选择DOM还是SAX解析模型是一个非常重要的设计决策。 DOM采用建立树形结构的方式访问XML文档,而SAX采用的是事件模型。
            DOM解析器把XML文档转化为一个包含其内容的树,并可以对树进行遍历。用DOM解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高,尤其是遇到很大的XML文件的时候。由于它的遍历能力,DOM解析器常用于XML文档需要频繁的改变的服务中。
            SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。        
        优势:
             ①不需要等待所有数据都被处理,分析就能立即开始。
             ②只在读取数据时检查数据,不需要保存在内存中。
             ③可以在某个条件得到满足时停止解析,不必解析整个文档。
             ④效率和性能较高,能解析大于系统内存的文档。    
        缺点:
             ①需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),文档越复杂程序就越复杂。
             ②单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。
        3. JDOM(Java-based Document Object Model)
            JDOM的目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一个Java特定模型,JDOM一直得到大力推广和促进。正在考虑通过“Java规范请求JSR-102”将它最终用作“Java标准扩展”。从2000年初就已经开始了JDOM开发。
            JDOM与DOM主要有两方面不同。首先,JDOM仅使用具体类而不使用接口。这在某些方面简化了API,但是也限制了灵活性。第二,API大量使用了Collections类,简化了那些已经熟悉这些类的Java开发者的使用。
            JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”(根据学习曲线假定为20%)。JDOM对于大多数Java/XML应用程序来说当然是有用的,并且大多数开发者发现API比DOM容易理解得多。JDOM还包括对程序行为的相当广泛检查以防止用户做任何在XML中无意义的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情况下的错误)。这也许是比学习DOM或JDOM接口都更有意义的工作。
            JDOM自身不包含解析器。它通常使用SAX2解析器来解析和验证输入XML文档(尽管它还可以将以前构造的DOM表示作为输入)。它包含一些转换器以将JDOM表示输出成SAX2事件流、DOM模型或XML文本文档。JDOM是在Apache许可证变体下发布的开放源码。        
        优点:
             ①使用具体类而不是接口,简化了DOM的API。
             ②大量使用了Java集合类,方便了Java开发人员。        
        缺点:
             ①没有较好的灵活性。
             ②性能较差。
    
二、XML解析器:
    Crimson(sun)
    Xerces(IBM)
    Aelfred2(dom4j)
    
三、XML解析包
    JAXP(JAVA 官方API)
    JDOM(解析效率最低)
    DOM4J(解析效率最高,最快)


这里主要讲一下DOM4J
    1、什么是DOM4J
    dom4j 是一种解析 XML 文档的开放源代码 XML 框架,是由IBM开发的。dom4j API 包含一个解析 XML 文档的工具。
    2、DOM4J的特点
    DOM4J是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
    DOM4J最大的特色是使用大量的接口,这也是Dom4J比较灵活的主要原因。
    Dom4J是用Java语言读、写、操作XML的新API函数。在直觉、简单和高效的前提下,这些API函数被最大限度的优化。
    3、DOM4J主要接口概览,如图:技术分享
    
    Attribute    定义了XML的属性
    Branch    能够包含子节点的节点如XML元素(Element)和文档(Document)定义了一个公共的行为
    CDATA    CDATA 定义了XML CDATA 区域
    CharacterData    标识接口,标识基于字符的节点。如CDATA,Comment, Text.
    Comment    Comment 定义了XML注释的行为
    Document    定义了XML文档
    Element    Element定义XML 元素
    ElementHandler    定义了 Element 对象的处理器
    Node     Node为所有的dom4j中XML节点定义了多态行为
    Text    定义XML 文本节点.
    XPath    在分析一个字符串后会提供一个XPath 表达式
    4、DOM4J读取XML
    读写XML文档主要依赖于org.dom4j.io包,其中提供DOMReader和SAXReader两类不同方式,而调用方式是一样的。这就是依靠接口的好处。
        SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(new File(“users.xml"));
    5、DOM4J解析XML
    一切XML分析都是从Root元素开始的。
        Element root = doc.getRootElement(); //获取根结点
        List books = root.selectNodes("/users/user");
        for (int i = 0; i < books.size(); i++) {
              Element book = (Element) books.get(i);
        }  
        
四、解析XML文档的过程:
    1.读取解析器工厂
    2.产生解析器
    3.解析XML,使用解析器,产生Document对象实现对XML的解析。

----------------------------------------分界线---------------------------------------------------

后面的话:到这里,XML基础基本上介绍的差不多了。这篇文章是在java2ee的XML课程的基础上整理的(其中以一部分是以java的思想得到的,比如说最后的DOM4J,我们也可以汲取其中有用的部分到Javascript中),同时也在网上查阅了相关资料对老师讲的不够细的东西进行了细化。XML和JSON在很多地方都很相似,前面的博文介绍到了使用库和插件可以让JSON和XML进行转化;在这篇博客中,对于Javascript DOM部分讲的较少,大家可以在网上查找相关信息,后面的博客中也会讲Javascript DOM与XML的关系,以及Javascript和XML的关系,它们之间更多的高级操作。

XML基础