xml文本处理

XML文档

 

1、 什么是格式正规的XML文档:所以遵守规定的XML基本语法规则的文档(数据)都称为格式正规的XML文档。这类数据在使用时可以不使用DTD或模式来描述它们的结构,它们也称做独立的(或非DTD)XML数据,这些数据不能够依靠外部的声明,属性值只能是没有经过特殊处理的值或默认值。

2、 一个格式正规的XML数据包含一个或多个元素,它们相互之间正确地嵌套,其中有一个元素,即文档元素,包含了文档中其他所有元素,所有的元素构成一棵简单的层次树,所以元素和元素之间惟一的直接关系就是父子关系,兄弟关系经常能够通过XML应用程序内部的数据结构推断出来,但这些既不直接,也不可靠(因为元素可能被插入到某个元素和它的一个或多个子元素之间)。文档内容包括标记和(或)字符数据。

3、 满足下列条件的数据就是格式正规的XML:

l  结束标记匹配相应的起始标记,并且在元素定义中没有重叠,对一个元素来说,没有多个相同名称的属性的实例。

l  语法XML符合规范,包括:起始标记都有匹配的结束标记(空元素标记除外)、元素标记不重叠、属性有惟一的名称、标记字符被正确地转义。

l  元素构成一个层次树,只有一个根节点。

l  没有对外部实体的引用(除非提供了DTD)。

4、 格式正规的文档的存在使得可以使用XML数据而不必承担构建和引用数据外部数据描述的重任。术语“格式正规的”与正规的数学逻辑有着相似之外,一个命题如果满足语法规则就是格式正规的,而不在意命题是真是假。

5、  有效的XML文档:任何XML数据对象被认为是有效的XML文档的条件是:它必须是格式正规的,并且它能够满足某些进一步有效性约束和匹配描述文档内容的语法。XML以XML Schema或DTD的形式提供文档结构的描述。

6、  使用DTD进行有效性验证可以确保:服从元素的父子关系,属性具有有效性,所有引用的实体被正确定义,以及遵守众多其他的有效性约束。


XML的文档类型定义DTD

 

一、引言

DTD是用来结构化XML数据的一套规则,当我们在一个更广的环境里,如B2B或是电子商务系统中,交换、处理及显示XML时,定义这样的规则是很重要的,使用DTD不仅允许XML数据遵循XML1.0是的一些高级的语法规则,也允许数据在内容和结构方面遵循我们自定义的规则。

二、使用DTD的必要性

1、  为什么要验证XML的有效性:

(1)       格式正规的XML数据要保证对XML语法和嵌套(分层)树结构的正确使用,这样可充分地关联静态内部应用程序,特别是在XML数据是由计算机产生和处理的时候。在这种情况下,应用程序有责任使用数据完成执行任何结构或者内容的验证、错误的处理和数据的解释。XML结构化信息及其逻辑,在发送和接收应用程序中通常和一般的规范不一样,通常是通过硬编码独立完成的,因此,更改XML数据结构必须从三个方面入手:规范、发送、接收应用程序。

(2)       例如,当一个内部应用程序在两个不同的关系数据库管理系统之间用格式正规的XML做为数据传输机制时,发送端假定已准备好了数据,而接收接也具备了确定输入数据的功能,这样任何数据验证都将发生在XML到数据库管理系统的传输过程之后。当数据在XML域时,不需要重新确定,因此,格式正规的XML能胜任数据传输。然而,当没有正式地描述XML数据时,描述或修改它的数据结构就困难了,因此它的结构和内容都压缩在应用程序的代码里,如果XML数据没有一个正式的描述,我们仅能利用XML的一小部分功能。

(3)       除了保证XML数据的格式规范之外,我们通常但并不是每次都要保证XML应用程序是有效的XML数据。为了做到这点,我们需要:

n 描述和确定数据结构,最好使之符合严格的、正规的风格

n 传送这些数据结构给其他的应用程序和人员

n 限制元素内容

n 限制属性类型和值,尽可能提供默认值

(4)       这些功能能够在两个正在协作的应用程序和伴随它们的文档中通过特定的代码进行处理。然而,在多个应用程序和用户之间,想在每一个应用程序中维护这些功能将成为一件非常困难的事,因此要找一种更标准的方法。

(5)       从独立的应用程序中分离出XML数据描述,允许所有协作应用程序共享一个单独的数据描述,这就是XML词汇表。共享通用的XML词汇表的一组XML文档被称为文档类型,而遵从某一文档类型的一个单独的文档叫文档实例。

2、  有效的XML:是格式正规的数据,这种数据遵循语法、结构和其他的一些在DTD中定义的规则。

(1)       可使用XML解析器来确认一个XML文档是否格式正规:许多解析器即是有效性验证解析器,能够提供更严格的验证选项去检查XML文档内容是否有效,这表示解析器本身就能够验证文档是否遵循特殊的XML词汇规则,这种验证是通过比较文档内容和DTD形式的相关模板来完成的。

(2)       DTD能被多个文档和应用程序共享,它的XML数据的集中描述和标准的有效性验证方法可使我们从众多的专门应用程序中移出数据描述和验证代码。数据描述代码成了DTD,有效性验证代码已存在于有效性验证XML解析器中,这样极大地简化了应用程序代码,提高了性能和可靠性。

三、DTD的详细描述

1、  定义:

(1)       DTD是一组能融合在XML数据里或者在单独的文档存在的声明,它定义一些规则来描述结构和被允许的XML数据内容,一个DTD只能和一定给定的XML文档或数据对象关联起来。

(2)       DTD使用一个正式的文法来描述XML文档的结构和语法,包括大量文档内容的允许值,这些被称为有效性约束的规则,确保了任何XML数据遵循与关联的DTD。

(3)       DTD是XML1.0规范的一部分,所以XML解析器和其他一些工具已广泛支持这种数据描述和有效验证方法。

(4)       DTD不使用格式正规的XML描述,但DTD声明表面上类似于XML的语法:用括号来分隔,并且在DTD里使用一种实体引用的特殊形式。DTD里的注释所使用的语法同样也能用在XML的注释里。

2、  特征:

(1)       DTD有效性验证的最大意义在于对元素分层树的结构定义:一个有效性验证解析器和DTD能确保所有必要的元素和属性在文档里出现,并且文档中没有未经授权的元素和属性,这确保了数据在被移交给应用程序之前就具有有效的结构。

(2)       DTD能用来与一个有效性验证解析器协作,对存在的XML数据进行有效性验证或在作者创建XML文档的过程中,对文档进行有效性验证,常用以下方法:

l  对必需出现的元素进行检查

l  在使用能读懂DTD的XML编译器的时候,提示作者包含它们

l  确认没有包含被禁止的元素,并且防止作者使用它们

l  实施元素内容和树结构

l  实施元素属性和它们允许的值

(3)       当DTD用于XML数据实例中的时候,提供信息和简化操作:

l  当属性值在XML数据中被忽略时,使用默认值

l  可转换内容

l  标准化的内容

(4)       DTD还有面向DTD作者的附加功能:

l  DTD可置换的内容

l  描述非XML数据

l  有条件节

3、  结构:一个给定XML文档的DTD被分成两部分――内部子集、外部子集,它们是相对于XML文档实例来命名的

(1)       内部子集:是包含于XML数据中的DTD的一部分

(2)       外部子集:是一组定位于各个独立的文档中的声明,它常是做为DTD引用,因为它经常包含在一个以.dtd为扩展名的文件中,虽然这是很正常的用法,但外部DTD无需是一个单独的文件,它能做为一个记录存储在数据库中,而内部子集也是同一DTD中的一部分。

(3)       并不要求DTD使用子集,DTD或许能完整地包含于XML数据中(内部子集),而没有外部子集,或是一个文档能简单引用外部子集而自身不包含DTD声明。在许多情况下,DTD将会结合两者使用(内部子集和外部子集都使用)。

(4)       当相似的声明存在于这两个子集中时,内部子集中的DTD优先于外部子集中的DTD声明。将会使用来自于内部子集的声明,而来自外部子集的声明将会忽略。

(5)       例如,当内部子集确定了一个空元素时,一个元素的外部子集描述可以允许有几个子元素。包含此DTD联合的任何XML数据,最好使用一个空元素,否则将被认为是无效的。

4、  将DTD与XML数据关联

(1)       用Document Type Declaration标记把DTD关联到XML数据对象,它从不简写成DTD,这个通过做为DOCTYPE声明引用以示和DTD相区别。

(2)       有效性验证解析器正是使用这个声明来检索DTD,并根据DTD规则来验证文档的有效性,如果DTD没有找到,那么解析器就会发送一个出错消息,而不能验证文档。

(3)       DTD仅仅指一个文档类型的定义,而不是把DTD和XML文档实例关联在一起的DOCTYPE声明。使用单独的DOCTYPE声明时,一个XML文档只能关联一个DTD。


XML Schema详解

 

1、  概述:

n  XML Schema功能强大,使用灵活,它对文档提供了双DTD更有力或松散的约束机制,同时保证文档的有效性。

n  它引入了数据类型的概念,使我们可以更容易地处理各种不同的文档。

n  它的语法与XML是一样的。

n  它描述了文档的结构和对它所包含的内容的限制。

2、  模式的重要性:模式不仅定义了文档允许包含的内容,它还可以:

n  生成应用程序可以处理的文档结构的抽象描述,这意味着我们可以参照模式来生成应用程序,而不是生成一个仅局限于自己使用的应用程序。还可以使用这个一个快或者超集来工作,基于一个通用的模式建立应用程序的风险远小于用自己的结构来建立应用程序的风险。

n  描述文档之间如何交流信息,模式在发送者和接收者之间规定了强制性的协议。

n  需要保存每一个应用程序,并检查是否执行。

n  在不同的群体之间共享,允许不同的公司共享相同的数据或者模型。

n  使得在不同的应用程序间创建、管理和处理相同的文件变得容易。

3、  相对于DTD,XML Schema有许多优点:

(1)      对数据类型的支持:这是它的最大的优点之一。

l  随着XML在实际应用中越来越多的使用,能够知道一个元素或者属性的内容是字符串、整数、布尔数、浮点数或是其他任何一种类型是一个很大的优势。

l  这意味着如果想表示一个数据类型,可以把它写入应用程序的逻辑中,也可以要在表示的元素中附带上类型属性以指示它的元素内容的数据类型。

l  这样应用程序必须:在把文档中的信息传递给应用之前,先检查文档的有效性;从属性中读取正确的数据类型;在处理之前把字符串元素内容转换为整数。

l  利用XML Schema的功能在模式中指定元素内容和属性值的数据类型,应用程序可以使用有效性验证组件,这个组件不仅可以保证文档是有效的,而且保证了其中的信息和预期的数据类型相匹配。


XPath的全面理解

 

1、  XPath是一个简单的语言,它用来对一个XML树进行导航,并返回应答节点集合。

2、 XPath表达式在XML应用中是普遍存在的。在XQuery中用来连续变量,在XML Schema中定义关键字,在XLink和XPointer中用来在外部文档中索引元素,在XSLT中作为匹配表达式,在以内容为基础的数据包中作为路由选择。

3、 XPath的目的:它提供了一种XML文档选定部分的定位及导航的方法,它运作在XML文档的抽象逻辑结构中,而不是它表面的语法上。它提供了很多函数,用于字符串、数字、布尔值和节点集合的处理,也有匹配机制,用于在XML文档中查找某个节点。

4、 XPath的数据模型:在XPath中,XML文档被看作一个节点树,而不是元素和其他XML文档组件的集合,这棵节点树包括七种不同类型的节点,有根节点、元素节点、属性节点、文本节点、命名空间节点、处理指令节点、注释节点。

n  根节点:每个文档有且只有一个,根节点的字符串值就是按文档中的顺序,根节点的所有后代文本节点的字符串值的串连,根节点没有扩展名。

n  元素节点:表示文档的元素根的一个元素节点,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点及其内容的文本节点。

n  属性节点:每个元素节点都有对应的一组属性节点,有可能为空。这个元素节点是每个属性节点的父节点,但一个属性节点不是它的父元素的子节点。子节点是表示元素根的一个元素节点。

n  命名空间节点:每个元素都有一组相关的命名空间节点,它可以是这个元素范围内的每个不同的命名空间前缀(包括XML前缀,它是由XML推荐标准中的命名空间隐含声明的),也可以是默认的命名空间(如果存在的话)。元素节点是它的每个命名空间节点的父节点,但一个命名空间节点并不是它的父元素的子节点。

n  处理指令节点:除了文档类型声明中的处理指令外,每个处理指令都有对应的处理指令节点,没有对应于XML声明的处理指令节点。

n  注释节点:除了在文档类型声明中的注释之外,XML源文档中的每个注释都有注释节点,注释节点的字符串值就是注释的内容(不包括注释的开始和结束标记)。

n  文本节点:源文档中的字符数据组成了文本节点

注:在注释、处理指令和属性值中的字符不会产生文本节点。

5、 要使用XPath,就要构造表达式,一个正确编码的表达式产生以下4类型对象之一,节点集(基本上是一个不具有重复值的节点无序集合)、布尔值、数字或字符串。当计算一个表达式产生对象时,它具有环境(由环境节点表示)、环境位置和长度(数字值)、变量绑定、函数库和名域声明。将环境节点看作当前节点,因此,所执行的任何移动都是从这个环境(或当前)节点开始,此外,环境位置表示当前节点按文档顺序在节点集中的近似位置,环境长度表示在当前节点集中的节点数量。

6、 XPath中最基本的表达式是位置路径表达式,通过位置路径表达式,可以精确的查找到XML元素结点的位置。位置路径可以是绝对的或相对的。绝对位置路径为环境指向文档节点,而相对位置路径则为其环境指向相对于其他节点的某些节点。位置路径表达式的每一部分被称作一个步骤,因为它在XML文档中逐步通过不同的节点级别。位置步骤包含轴(axis)、节点测试和谓词。XPath轴告诉使用什么关系标识点,如子、父或后代。节点测试用函数标识节点类型/名称。谓词使用额外的小型表达式准确定义什么节点或节点集被查询。XPath包含一些函数,这些函数必须被包含在任意一个符合XPath的实现中。

7、 XPath的原理:用来对一个层次结构进行导航,有一个起点和上下文节点,可按指定的方向移动,在XPath中称为轴,需要一步或几步到达目的地,在XPath中命名为定位阶。定位路径的重要特性是它返回的是一个节点集合,而不是XPath能返回的其他的任何数据类型,它可告诉XSLT或其他处理器如何对XPath表示的XML源文档进行导航,一个定位路径由一个或多个定位阶组成。定位阶可由三个部分组成:轴,节点测试――用以指定节点类型和定位阶所选择的节点的扩展名,零个或多个谓词――可以使用任意的XPath表达式进一步提炼定位阶所选定的节点的集合。XPath有一个自然子集,用以匹配即测试一个节点是否与要求的方式相匹配。

8、 定位路径是XPath表达式中最重要的类型,定位路径可以在表示XML源文档的XPath数据模型是选定与上下文节点相关的节点集合。定位路径是一种只返回一个节点集合的XPath表达式的特殊形式。

9、 XPath中的上下文实际上是由这个上下文节点的五个部分组成的,包括:

n  节点――上下文节点

n  一对非零的正整数――上下文的位置和上下文的大小

n  一组相关的变量组合

n  一个函数库

n  用于表达式的命名空间声明的集合

10、  XPath的前进轴与后退轴:

l  只包括上下文节点或按文档顺序位于上下文节点之后的那些节点的轴就是前进轴,有:child、parent、descendant、descendant-or-self、following-sibling、following、attribute、namespace、self。

l  只包括上下文节点以及它之前的那些节点的轴则为后退轴,有:ancestor、ancestor-or-self、preceding-sibling、preceding。

11、  XPath的语法:

n  非缩写的相对定位路径:如

child::paragraph-这个表达式选择了上下文节点的<paragraph>子节点。

child::*-这个表达式选择上下文节点的所有子元素节点。

child::node()-这个表达式选择上下文节点的所有子节点

attribute::*-这个表达式返回上下文节点的所有属性节点。

descendant::paragraph-选择上下文节点的后代的<paragraph>元素。

Child::chapter/descendant::paragraph-选择的是上下文节点的<chapter>子元素的<paragraph>元素后代。

n  非缩写的绝对定位路径:如:

/child::*-选择根节点的所有子节点。

/descendant::paragraph-选择所有的〈paragraph〉元素节点。

/descendant::section/child::paragraph-选择所有表示<paragraph>元素的节点,这些元素节点都由一个<section>父元素节点。

n  缩写的相对定位路径:如:

paragraph-选择的是上下文节点的子节点是<paragraph>元素的节点,等价于child::paragraph。

*-选择上下文节点的所有子元素节点,等于child::*。

@number-选择上下文节点的number属性,等于attribute::number。

n  缩写的绝对定位路径:如:

//paragraph-选择所有的<paragraph>节点,它们都是根节点的后代,等于/decendant::paragraph。

//chapter/section-选择父节点为chapter的所有<section>节点,节点chapter是根节点的后代,等于/descendant::chapter/child::section。

12、  XPath与正则表达式:正则表达式是设置字符串匹配式样的强大方式,它们是XML Schema提议推荐标准中的设置式样(约束XML文档内容)的重要部分。XPath要求草案表明XPath必须支持正则表达式。


SAX的全面理解

 

1、  SAX是专门为避免使用DOM时遇到内存问题而设计的,它不采用一次将整个文档载入内存的方法,取而代之的是将文档送入一个解析器并触发基于元素、属性等的事件,如需要从一个大的XML文档中提取少量信息,通常SAX是最好的实现方法,当需要提取一个XML文档的整个内容,或文档包含比较复杂的关系时,SAX不是首选,因为这需要在文档中多次地传递信息或缓存文档信息。

2、  SAX是API,提供了由解析器来实现的接口,解析器要实现由SAX定义的接口。

3、  一个SAX解析器遍历整个XML文档,而后向我们告知所有的事件,处理完输入数据后,SAX解析器就会丢弃它,而只在内在中保留当前正在处理的数据。

4、  SAX处理的缺点:

l  不能随机存取――由于SAX提供的按顺序处理的模型不可以随机地存取一个XML文档,正在被解析的元素不会知道已经或者将要解析的元素是什么。用SAX对整个XML文档进行搜索是一项很繁重的工作。

l  不能横向移动――由SAX提供的文档访问不仅是按顺序的,而且也是分层次的,这使得在元素之间地水平移动变得非常困难。在解析器移到到某个元素的同胞元素之前,每个元素都会向下解析到其叶子节点,因此任何时候都不会有任何明确的线索告诉我们到底是在树状结构的哪层。

5、  SAX是通过一系列的事件让你访问XML文档中的信息,所有的SAX解析器要做的是遍历整个XML文档,并且根据遇到的标记激活事件,如当发现给定的标记时,它可以激活一个回调方法,告诉该方法制定的标签已经找到,接下来,开发人员自己来决定所要处理的标签,开发人员的职责就是创建一个处理器类,以使事件具有意义,并且可能创建一个对象模型。为了使我们的应用程序能够对特定的事件进行处理,我们必须实现由解析器调用的处理器接口,并在解析器里注册它们。一个处理器就是一个程序接口,该接口定义了特定事件的方法。

6、  在SAX中可创建一个名为display的递归方法,该方法中,使用switch语句,其中又有多个case语句,用来处理不同类型的节点:让文档主动送上门来,让代码根据文档中不同的结点调用不同的case语句,这就是SAX要做的,这是基于事件的,这就是说当SAX解析器遇到一个元素时,它就把它当作一个事件对待,调用对元素指明的应该调用的代码,当遇到一个操作指令时,它也把它当作一个事件对待,调用对操作指令指明的应该调用的代码等等。

7、  SAX对XML文档的分析能够立即开始,而不是等待所有的数据被处理,而且,由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档来说是个巨大的优点,事实上,应用程序甚至不必解析整个文档,它可以在某个条件得到满足时停止解析,

8、  SAX是在读取文档时激活一系列事件,这些事件被推给事件处理器,然后由事件处理器提供对文档内容的访问。

9、  SAX最大的优点是内存消耗小,因为整个文档无需一次加载到内存中,使它可以解析大于系统内存的文档。那些只需要单遍读取内容的应用程序可从SAX解析中大大受益。


Conferenceon Information and Knowledge Management=CIKM


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值