一种xml文件解析的方法及装置的制作方法

文档序号:6458017阅读:482来源:国知局
专利名称:一种xml文件解析的方法及装置的制作方法
技术领域
本发明涉及信息处理技术领域,特别是涉及一种XML文件解析的方 法及一种XML文件解析的装置。
背景技术
,XML ( The Extensible Markup Language,可扩展标识-浯言)是一种独 立于平台的编程语言,由于它提供了用于创建公共信息格式以及共享网 络上不同软件应用的格式和数据的灵活机制,从而特别适于在诸如 Intemet的分布式网络上使用。XML来源于SGML,包括描述文件内容的 标记符号(标签)。XML在标记符号^f吏用方法上同HTML(超文本标记语言) 相似,但与HTML相比,它至少具有两个基本区别。首先,HTML具有定 义标记符号的专用集,而在XML中所允许标记符号是不受限和自定义的, 从而XML是可扩展的。即,尽管XML也具有标准化标记符号,但XML程 序员并不受定义标记符号标准集的限制,而是能够定义出新的标记符号。 其次,由于HTML标签和属性仅定义出如何显示实际内容,使HTML受限, 但XML标签和属性既能够定义如何显示信息(例如,通过Web浏览器),又 能够定义显示什么样的内容。XML是一种简单的数据存储语言,可以使用 一 系列简单的标记描述 数据,而这些标记可以用方便的方式建立,XML的简单使其易于在任何 应用程序中读写数据,比如,在使用计算机处理各种业务逻辑时,往往 需要进行建模分析,然后根据模型生成业务模型描述。由于XML语言具 有纯文本、以及强大的标签描述特性,在描述业务逻辑时采用XML语言, 则可以更容易地在应用服务器上部署。目前常用的XML解析方法是SAX和DOM,在此基础上产生许多开源 解析框架,如Castor、 JAXB、 Digester等。这些框架都比较类似,都是将 XML文件转换成相应的Java对象的过程,以下以Digester为例具体说明简言之,Digester由"事件"驱动,通过调用预定义的规则操作对象栈, 将XML文件转换为Java对象。工作原理如下 .Digester底层采用SAX解析XML文件,由于SAX解析器采用基于 事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现 给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已 经找到。所以相应地,对象转换由"事件"驱动,即在识别出特定XML元 素时(实际被细分为begin、 body、 end、 finish四个时点),将执行特定的 动作,比如创建特定的Java对象,或调用特定对象的方法等。此处的XML 元素根据匹配模式(matching pattern)识别,而相关操作由规则(mle)定义。 在转换过程中,Digester维持了一个对象栈,用来存放转换中生成的、或 是为转换临时创建的Java对象。对输入XML文件作了一趟完整的扫描 后,对象栈的栈顶元素即为目标对象。由于Digester屏蔽了 SAX解析的 细节,使用者仅需关注转换操作本身,大大简化了转换操作。在基本使用中,使用者通过调用Digester类的相关方法,来创建匹配 才莫式与头见则的映射序列。比如,调用addSetProperties(String pattern),向 Digester中加入SetPropertiesRule。然而,在基本的使用方式下,Digester 虽然使用XML文件定义Java对象的状态,提高了系统的灵活性,但是不易修改与重用。所以Digester还提供了 一种高级的使用方式,用 一个 XML文件定义Java对象的状态(it据源文件),用另 一个XML文件定义 装载数据源文件的装载逻辑。在这种情况下,对象的装载过程分成了两 步1. 装载逻辑的"装载",其结果表现为定义了 rule的Digester;2. 根据上一步得到的Digester,装载目标对象。显然,采用这种方式,需要为一个装载逻辑多写一个配置文件,如 果需要执行复杂业务逻辑的XML文件解析,将增加系统开销,严重浪费 系统资源。并且,由于提供的规则标签所定义的动作简单,功能单一, 不支持多栈操作,对于复杂的解析动作无法定义或定义比较繁瑣困难。所以,本领域技术人员迫切需要发展一种能在节省系统资源的前提下,简单、有效的实现XML文件配置及解析的方法。
发明内容
'本发明所要解决的技术问题是提供一种XML文件解析的方法,用以 在节省系统资源的前提下,简单、有效的实现XML文件配置及解析。本发明还提供了 一种XML文件解析的装置,用以保证上述方法在实 际中的实现及应用。为了解决上述问题,本发明公开了一种XML文件解析的方法,包括定义所述XML的标签与相应对象模型特征的映射,所述对象模型特 征具有配置属性,所述配置属性用于标识执行所述对象模型特征的栈名;生成由所述XML标签编写的XML文件,所述XML文件包括装载 任务对象脚本和组件对象脚本;提取所述组件对象脚本的URI,并依据所述URI在所述装载任务对 象脚本和组件对象脚本之间建立关联;解析所述装载任务对象脚本,生成装载任务序列,所述装载任务序列 包括URI;遍历所述装载任务序列,获得当前URI指定的组件对象脚本;解析所述组件对象脚本,返回相应栈名对应的栈顶组件对象。优选的,所述装载任务对象脚本包括装载对象配置文件和装载规则脚 本,所述装载任务对象脚本的解析步骤进一步包括依据所述装载规则脚本生成第一 SAX解析器;由所述第一 SAX解析器解析所述装载任务对象脚本。优选的,所述组件对象脚本包括组件对象配置文件和组件规则脚本, 所述组件对象脚本的解析步骤进一步包括依据所述组件规则脚本生成第二 SAX解析器;由所述第二 SAX解析器解析所述组件对象脚本。优选的,通过以下步骤返回栈顶组件对象依据所述栈名设置空栈;将相应的组件对象压入当前栈中;提取栈顶组件对象出栈。优选的,所述定义步骤还包括将描述所述对象模型特征的元模型特征映射到相应的XML标签。 优选的,所述的方法还包括将描述所述元模型特征至所述XML标签的映射编码至所述SAX解 析器中。优选的,所述SAX解析器包括用于在所述XML文件与对象模型特征之间进行转换的可执行代码。本发明实施例还公开了一种XML文件解析的装置,包括 定义模块,用于定义所述XML的标签与相应对象模型特征的映射,所述对象模型特征具有配置属性,所述配置属性用于标识执行所述对象模型特征的栈名;生成模块,用于生成由所述XML标签编写的XML文件,所述XML 文件包括装载任务对象脚本和组件对象脚本;关联模块,用于提取所述组件对象脚本的URI,并依据所述URI在 所述装载任务对象脚本和组件对象脚本之间建立关联;装载解析模块,用于解析所述装载任务对象脚本,生成装载任务序列, 所述装载任务序列包括URI;遍历模块,用于遍历所述装载任务序列,获得当前URI指定的组件 对象脚本;组件解析模块,用于解析所述组件对象脚本,返回相应栈名对应的栈 顶组件对象。优选的,所述装载任务对象脚本包括装载对象配置文件和装载规则脚 本,所述装载解析模块进一步包括第一解析器产生子模块,用于依据所述装载规则脚本生成第一 SAX 解析器;第一SAX解析器,用于解析所述装载任务对象脚本。优选的,所述组件对象脚本包括组件对象配置文件和组件规则脚本,所述组件解析模块进一步包括第二解析器产生子模块,用于依据所述组件规则脚本生成第二 SAX解析器;第二SAX解析器,用于解析所述组件对象脚本。 优选的,组件解析模块进一步包括建栈子模块,用于依据所述栈名设置空栈;压栈子模块,用于将相应的组件对象压入当前栈中; 出栈子模块,用于提取栈顶组件对象出栈。 优选的,所述定义模块还包括标签映射子模块,用于将描述所述对象模型特征的元模型特征映射到 相应的XML标签。优选的,所述的装置还包括编码模块,用于将描述所述元模型特征至所述XML标签的映射编码 至所述SAX解析器中。与现有技术相比,本发明具有以下优点首先,本发明通过开发新的规则动作模板以支持对命名栈的操作, 在动作模板的基础上开发一组新的规则动作,相应地,对原有 commons-digester的SAX解析器Digester进行扩展,支持对命名栈的操作, 并且,定义与规则动作对应的规则标签,开发XML规则脚本DTD、规则 对象工厂,扩展规则解析器以支持相应规则标签识别、从而触发规则对 象工厂的调用,实现规则标签到规则动作对象的转化,从而使本发明可 以适用各种XML标准才艮文格式,并且应用本发明的规则标签可以完成各 种复杂的解析动作,大大简化了 XML配置文件与XML规则脚本的开发和 维护工作;其次,本发明无需额外生成配置文件描述与创建对象对应的配置文 件和规则脚本,有效节约了系统资源;再者,本发明通过遍历产生装载任务,能批量生成uri的装载,从而 支持配量处理与组件即插即用;最后,本发明对于服务提供商来说,技术实现简单,无技术障碍, 无特殊保密算法,成本和风险较低。


图1是本发明的一种XML文件解析方法实施例的流程图;图2是本发明的一个具体例子中的栈操作过程示意图;图3是本发明的一种XML文件解析装置实施例的结构框图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,T面结合 附图和具体实施方式
对本发明作进一步详细的说明。本发明可用于众多通用或专用的计算系统环境或配置中。例如个 人计算机、服务器计算机、手持设备或便携式设备、平板型设备、多处 理器系统、包括以上任何系统或设备的分布式计算环境等等。本发明可以在由计算机执行的计算机可执行指令的 一般上下文中描 述,例如程序模块。 一般地,程序模块包括执行特定任务或实现特定抽 象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布 式计算环境中实践本发明,在这些分布式计算环境中,由通过通信网络 而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块 可以位于包括存储设备在内的本地和远程计算机存储介质中。目前,使用XML处理复杂业务逻辑可以分为两种处理类型一种是传统的硬编码方式。即只使用XML描述业务逻辑的数据,由 真正的业务处理代码解析这些数据,完成业务逻辑。这种方式只是把数 据存放成XML格式,如果业务逻辑有什么变化,通常只能修改业务处理 代码, 一般情形下需要重新编译大量的代码,编译后的代码需要重新部 署,灵活性差。而且随着业务逻辑的复杂化,则业务处理代码也越来越 复杂、越来越庞大,代码的可维护性变差。另一种是XML到应用语言的映射。由于XML是SGML的筒化,因此 它也属于元语言,可以由使用者自行定义,进而产生出完全符合使用者 需求的应用语言。而且应用语言更能够处理各种更为复杂的逻辑。通过 XML描述的复杂处理逻辑,可以通过XML解析器生成对应的应用语言。 而且这种解析、编译、处理的过程可以做成一体,完成对XML语言的解 释执行过程;此外,上述过程也可以分开,只部署解析后的应用语言或 编译后的目标语言,提高处理的速度,带来很大的灵活性。在实际中,由于XML的灵活性和可读性,XML通常用作对象模型的 串行化机制。使用者能够定义XML标记符号以与某种类型的数据相对应, 然后创建XML文件(也称为XML文档),可对XML文件进行转换,以提供与标签和属性相关联的内容。例如,如果想要建立描述某类产品的标准 格式,以便能在不同平台的多.个应用上共享该类产品的描述,可定义与该产品相对应的通用标签,例如,"SHIRT(衬衫)",以及该标签的属性, 每个属性定义了该产品的特性,例如,"SIZE(尺寸)"属性、"COLOR(颜色)" 属性、"MATERIAL(材料)"属性、"COST(价格)"属性等。属性字段中提供 有实际数据内容,例如,large(大号)、red and blue stripes(红蓝条紋)、 cotton(棉)、$29.95等。然后可将关于该产品的数据(^t据内容)以独立于平 台的XML文件的形式发送到运行XML解释器程序的任何其他计算机上, XML解释器程序可以用于转换和理解这些特定标签。使用面向对象技术开发的应用软件程序通常是基于底层"对象模型"。 对象模型是描述系统数据和行为的有关"对象"的集合。对象通常描述真实 世界的实体。例如,名为"Address(地址),,的对象可具有名为"Street(街道)"、 "City(城市)"等的属性以及名为"getStreetO"、 "getCityO"的方法或函数。在 构建良好的软件系统中,将底层对象模型设计为独立于系统中其他服务, 例如传输机制,用户界面,数据存储等的层。按照这样的方式,对象模 型成为可为其他应用所包含在内的可重用组件。在使用XML的应用中,惯用的做法是将XML文件中所包含的数据模 型化为对象模型。相反地,通常存在现有对象模型并使用XML作为串行 化格式。例如,将具有标签〈address〉/〈address〉的XML实体模型化为对 象名"Address"。从而,其他应用组件(例如,用户界面)的代码可与对象才莫 型中的对象交互,但不与底层XML交互。这提供了将系统中数据的含义 与读出和写入,XML的实际机制相隔离的较好抽象层。从而,在系统中 会存在将对象模型转换到XML(反之亦然)的层。在某些情形中,XML中 的数据元素以简单而直接的方式映射到对象模型中的值,正如在以上示 例的。然而,通常的情形是,映射并不简单,且存在复杂的规则,以便 进行转换。一般而言,将XML文件转换成对象模型的过程涉及到三个基本步骤: 第一、分析XML文本中的每个字符,以识别"合法"的XML标识(token), 诸如开始标签,属性,结束标签,和CDATA节;第二、分析标识,以验证它们形成合法的XML结构(例如,所有标签具有匹配的打开和关闭标签);第三、在翻译过程中,将XML文件中包含的数据相应转换为属于对 象模型和集合的数据元素和对象。数据元素可以表示为对象模型或其他 对象中的简单属性。例如,"地址(address)"具有"城市(city)",其为简单属 性,"雇员(employee)"具有"地址(Address)",其为表示对象才莫型中另 一对 象的复杂类型。通常还能够将地址(Address)的属性和雇员(Employee)与地 址(Address)之间的对象关联,以作为结构特征。由于众多不同类型的配置文件需要与不同的解释脚本关联起来,同 时需要一种机制将运行期需要加载的系统组件同配置文件对应起来,并 且根据复杂业务平台配置多样性、配置文件解析规则复杂和组件数量众 多的特点,实现新增的服务组件可以动态接入系统的功能,即配置的位 置决定文件可供加载,而不需要额外配置文件支持来描述新组件的接入。参考图1,示出了本发明的一种XML文件解析方法实施例的流程图, 可以包括以下步骤步骤IOI、定义所述XML的标签与相应对象模型特征的映射,所述 对象模型特征具有配置属性,所述配置属性用于标识执行所述对象模型 特征的栈名;步骤102、生成由所述XML标签编写的XML文件,所述XML文件 包括装载任务对象脚本和组件对象脚本;步骤103、纟是取所述组件对象脚本的URI,并依据所述URI在所述装 载任务对象脚本和组件对象脚本之间建立关联;步骤104、解析所述装载任务对象脚本,生成装载任务序列,所述装 载任务序列包括URI;步骤105、遍历所述装载任务序列,获得当前URI指定的组件对象脚本;步骤106、解析所述组件对象脚本,返回相应栈名对应的栈顶组件对象。本发明假设使用元模型,即所述步骤101可以包括以下子步骤将描述所述对象模型特征的元模型特征映射到相应的XML标签。 具体而言,描述对象模型以及该模型中的不同对象彼此之间如何相关的模型,这种元模型的示例包括Eclipse建模框架(EMF)和JAVAbean。 在其最简单形式中,XML解析器是在XML中的标签名与元模型的特征 之间的映射,以及使用元才莫型的特征在值与XML之间来回转换所必需的 相关行为。当存在描述对象模型的元模型时,也存在描述XML的表格和 标签名的XML元数据。当应用本发明时,从XML到元模型元数据的映 射被编码至解析器中。其解析基于对象模型实现,对象包含引用到其他 子对象,且XML节点具有子节点,从而,所述解析器还包含到子翻译器 的引用,这样就形成将对象模型和XML元模型相比照的树形结构。由于 解析器包括关于如何将XML模型转换成对象模型以及如何将对象模型转 换成XML的信息和规则,因而进行映射的所有复杂规则都包括在解析器 中,若需要进行改变,则可以在解析器中定制相应规则使其得以实现。优选的是,所述装载任务对象脚本可以包括装载对象配置文件和装 载规则脚本,在这种情况下,所述步骤104可以包括以下子步骤 子步骤S1、依据所述装载规则脚本生成第一 SAX解析器; 子步骤S2、由所述第一 SAX解析器解析所述装载任务对象脚本。 进一步地,所述组件对象脚本可以包括组件对象配置文件和组件规 则脚本,在这种情况下,所述组件对象脚本的解析步骤可以包括以下子 步骤子步骤S3、依据所述组件规则脚本生成第二 SAX解析器; 子步骤S4、由所述第二 SAX解析器解析所述组件对象脚本。 为保证SAX解析器的解析,本发明还可以包括以下步骤 将描述所述元模型特征至所述XML标签的映射编码至所述SAX解 析器中。在这种情况下,所述SAX解析器可以包括用于在所述XML文件与 对象模型特征之间进行转换的可执行代码。以下对SAX解析XML文件的原理进4亍说明SAX是基于事件的简单API ,例如,需要解析的XML代码如下所示< xml version="1.0" encoding="gb2312" > <books><book email="zhoujimhui"><name addr=" addre s s" >rj zj h</name> <price>jjjjjj</price> </book> </books>这个XML文件中包括了根元素、属性、子节点。解析这个XML文 件的Java〗戈码如下所示1 public class SaxParse {2 public SaxParseQ{3 SAXParserFactory saxfac=SAXParserFactory.newInstance();4 try {5 SAXParser saxparser二saxfac.newSAXParser();6 InputStream is=new FilelnputStream("bin/library.xml");7 saxparser.parse(is, new MySAXHandler());8 } catch (ParserConfigurationException e) {9 e.printStackTrace();10 } catch (SAXException e) {11 e .printS tackTrace();12 } catch (FileNotFoundException {13 e.printStackTrace();14 } catch (IOException {15 e.printStackTraceO;16 }17 }18 public static void main(String[] args) {19 new SaxParse();20 }法,它21 }其中,(1)得到SAX解析器的工厂实例3 SAXParserFactory saxfac=SAXParserFactory.newInstance(); 这是一个javax.xml.parsers.SAXParserFactory类的实例。 (2 )从SAX工厂实例中获得SAX解析器 5 SAXParser saxparser=saxfac.newSAXParser();(3 )把要解析的XML文档转化为输入流,以便DOM解析器解析6 InputStream is=new FilelnputStream("bin/library.xml"); InputStream是一个接口 。(4 )解析XML文档7 saxparser.parse(is, new MySAXHandler());使用SAX解析器时,必须实现内容处理器ContentHandler接口中的 一些回调方法,因而i殳置了 org.xml.sax.helpers.DefaultHandler类,它的类 声明为public class DefaultHandler'implements EntityResolver , DTDHandler , ContentHandler , ErrorHandler可以看出,它至少实现了 ContentHandler这一接口 。这个类所对应的 Java代码如下所示public class MySAXHandler extends DefaultHandler { boolean hasAttribute=false; Attributes attributes=null; /* (非 Javadoc ) * @see org.xml.sax.helpers.DefaultHandler#startDocument()public void startDocument() throws SAXException { System.out.println("文档开始打印了 ");/* (非 Javadoc ) * @see org.xml.sax.helpers.DefaultHandler#endDocumentO氺/public void endDocumentO throws SAXException { System.out.println("文档打印结束了 ");/* (非 Javadoc )org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String , java.lang.String, Java.lang.String,org.xml. sax. Attributes)public void startElement(String uri ,String localName , String qName,Attributes attributes) throws SAXException { if(qName.equals("books")) { return',if(qName.equals("book")) {System.out,println(attributes.getQName(0)+attributes.getValue(0));if(attributes.getLength()>0){ this attributes=attributes; this.has Attribute=true;/* (非 Javadoc)org.xm—l.sax.helpers.DefaultHandler#endElement(java.lang.String , Java.lang.String, java.lang.String)public void endElement(String uri, String localName , String qName)throws SAXException { if(has Attribute&&(attributes! =null)) {for(int i=0; i<attributes.getLength(); i++){System.out.println(attributes.getQName(O)+attributes.getValue(O));/* (非 Javadoc) * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int,public void characters(char[] ch, int start,int length) throws SAXException { System.out.println(new String(ch, start, length));这个类实现了 ContentHandler 4妄口中的如下方法 (1 ) startDocument() 用于处理文档解析开始事件public void startDocument() throws SAXException { System.out.println("文档开始打印了 ");(2 ) endDocument() 用于处理文档解析结束事件public void endDocument() throws SAXException { System.out.println("文档打印结束了 ");(3 ) startElement 用于处理元素开始事件public void startElement(String uri,String localName, StringqName ,Attributes attributes) throws SAXException { if(qName.equals("books")){ return;if(qName.equals("book")){System.out.println(attributes.getQName(0)+attributes.getValue(0));if(attributes.getLength()>0) { this.attributes=attributes; this.hasAttribute=true;第二个参数String qN ame *示&个元素的名字,^口 根节点 <books></books> 它的qName为"books" 最底层节点 <price>jjjjjj</price>它的qName为"price" 所述代码可以解释为,当遇到根元素"books,,时就什么也不做跳过, 当遇到"book"元素时就打出它的属性(它只有 一 个属性<book email="zhoujunhui"></book> )。当是其它节点时(这下只剩下最底层的 两个节点"name"和"price"了 ),就把它的属性取出来存到this逾ibutes 域中,以后中元素结束事件好处理。(4) endElement 用于处理元素结束事件public void endElement(String uri,String localName, StringqName)throws SAXException { if(hasAttribute&&(attributes!=null)){for(inti=0; i<attributes.getLength(); i++){System.out.println(attributes.getQName(O)十attributes.getValue(O));代码的作用是如果这个元素的属性不为空 (hasAttribute&&(attributes!=null)),就把它们打印出来。(5 ) characters(char[] ch,int start, int length)处理元素字符的内容public void characters(char[] ch, int start,int length)throws SAXException {System.out.println(new String(ch, start, length));还有其它的事件,只要看一下ContentHandler这个接口就行了 ,如 (6) startPrefixMapping(String prefix, String URI) 处理前缀映射开始事件,参数表示前缀名称和所指向的URI(7 ) endPrefixMapping(String prefix, String URI) 处理前缀映射结束事件,参数表示前缀名称和所指向的URI(8 ) ignorableWhitespace(Char[] ch, int start, int length) 处理元素中可忽略的空格(9 ) processingInstruction(String target, String data) 处理解析中产 生的处理指令事件。当然,上述方法仅仅用于举例,本领域技术人员根据需要或经验采 用任一种扩展框架或解析器都是可行的,本泉明对此不需要进行限定。本发明实施例中 一种技术实现关键在于,以模拟对象出入栈操作为蓝本,对象出入栈操作主要可以包括以下五个方面1、 直接对栈的操作,如pop、 dup、 xchg、 push-value、 cp、 dump等 代码所对应的操作;2、 XML数据入栈,如push-attribute、 push-content等代码所对应的操作;3、 使用XML数据对栈顶对象操作,如set-attribute、 set-property、 set-content等代码所对应的操作;4、 方法调用,如 invoke-static 、 invoke-object 、 invoke-parent 、 invoke-child、 create-object等代码所对应的操作;5、 动作标识,如begin、 end、 if、 include-url、 switch/case/default、 if条件组等代码所对应的操作。因而,本实施例可以通过以下子步骤返回栈顶组件对象 子步骤Q1、依据所述栈名设置空栈S; 子步骤Q2、将相应的组件对象压入当前栈中; 子步骤Q3、提取栈顶组件对象出栈。在实际中,根据配置加载的需求,所述XML数据的配置加载可以采 用扩展commons-digester来实现。根据本说明书中的相关内容可以得知, commons- digester可以将XML数据装载成Java object API。它使用了 SAX 解析器,当解释到某个XML事件标签时,触发同该标签相关的一组动作, 在动作中而完成java object的创建、加工、方法调用等操作。基于所述 commons-digester 才匡架, 可以开发 config.rule , 该包通过对 commons-digester包的扩展,定义了一组对象模型特征,同时定义了所述 对象模型特征的名称。XML标签用于编写XML规则脚本,规则脚本产 生SAX解析器,SAX解析器可以用来解析XML配置创建对象。具体而 言,规则脚本可以通过解析配置文件的对象模型特征,通过对栈的操作, 完成配置数据和生成对象的緩存及运算的过程。例如,当遇到XML事件时,定义的对象模型特征可能产生新的对象,新产生的对象便保存在栈中;或者当.从XML的事件中读取的属性,定义的对象模型特征可以用该 属性的值,设置栈中对象的属性。为使本领域,技术人员更好地理解本发明,以下以在实际中应用本发 明为例进行说明。一、 定义一组新的规则动作,每个规则动作都具有有一个特定属性 target,它标识该标签动作才喿作的栈名。同时对原有commons-digester的 解析器进行扩展,在原有内置栈的基础上,新增了一个扩展栈及其数据 结构和对象出入栈操作,在解析过程中还可以动态建立临时栈。经过所 述扩展后,所述解析器可以对规则动作target属性命名栈的识别,并支持 新增规则动作对命名栈的操作。例如,在扩展解析器中将新增扩展栈名为"—extend—", commons-digester的解析器的原有内置栈名为"—base—"。新增规则动作 通过命名栈target的方式,支持栈与栈之间操作。二、 针对上述定义的规则动作,定义与规则动作对应的规则标签, 规则标签用于书写XML规则脚本。同时,扩展规则解析器以支持相应规 则标签识别、从而触发规则对象工厂的调用,实现规则标签到规则动作 对象的转化。基于上述定义,应用本发明的一种XML文件解析过程为三、 使用规则标签编写XML规则脚本,编写XML文件,其中,所 述XML文件可以包括装载任务对象脚本和组件对象脚本,具体而言,所 述装载任务对象脚本可以包括装载对象配置文件和装载规则脚本;所述 组件对象脚本可以包括组件对象配置文件和组件规则脚本,为了解决组件对象脚本与装载任务对象脚本之间的关联问题,引入 了统一资源标识符(Uniform Resource Identifier,简称"URI")唯一标识 一个组件,公知的是,URI —般由三部分组成访问资源的命名机制; 存放资源的主机名;资源自身的名称、路径或者参数。例如, http:〃www.webmonkey.com. cn/html/html40/;这个URI表示了 一个可通过HTTP协议访问的资源,位于主机www.webmonkey .com.cn上,通过路径 "/html/html40"访问即可。在网络资源数据传输领域中比较常用的是URL (Uniform Resource Location,统一资源定位符),URL是URI命名机制 的一个子集。在本例中,每个URI需要关联两份文件,组件对象脚本 dataxml与装载任务对象脚本rulexml。进一步地,采用URI标识信息的 一部分同另外的目录信息、获取方式信息组成URL,最终定位dataxml 和rulexml 。四、 解析装载任务对象脚本,在装载管理器中生成装载任务,具体 可以包括以下步骤1、 依据所述装载规则脚本生成SAX解析器。2、 由所述SAX解析器解析装载任务对象脚本,动态生成装载任务 序列,每个装载任务序列具有URI标识。五、 指定装载任务URI,装载由URI标识的装载任务序列,以创建 组件对象,具体可以包括以下步骤1、 遍历URI标识的装载任务序列,取得指定装载任务的组件对象脚本;2、 依据所述组件对象脚本的组件规则脚本生成SAX解析器;3、 由所述SAX解析器解析组件对象脚本;4、 SAX解析器返回栈顶组件对象。 以下对出入栈的具体操作进行说明 々支设组件对象配置文件如以下代码所示 < xml version="1.0" encoding="gb2312" > <permission-manager〉〈processor name="identify_processor" impl-class="com.dc.eai.service.permission.identify.ServiceIdentify"/> </permission-manager> 相应的组件^见则脚本如以下代码所示 < xml version="1.0" encoding="gb2312" > <digester-rules><pattern value="permission-manager"> <begin> <invoke-staticclass-name="com.dc.eai.service.permission.PermissionManager" method-name="getInstance"/></begin><pattern value="processor"> <begin>〈push-attribute attr-name="name"/> <create-object class-name="impl-class"param-count="0"/><dup index="27> <invoke-objectmethod-name="addProcessor" param-count="2'7></begin></pattem> <end><cp source="—extend—" target="—base—"/> </end></pattem> </digester-mles>依据上述代码模拟栈操作的过程如图2所示,可以包括以下步骤步骤A1、置空扩展栈后,将permission-manager压入栈中(对应图2 中第一个—extend一所表示的内容);步骤A2、进一步将identify_processor压入栈中(对应图2中第二个 _extend一所表示的内容);步骤A3、进一步将Serviceldentify压入栈中(对应图2中第二个 _extend—所表示的内容);步骤A4、提取才戋顶元素permission-manager,并力文入内置片戋—base—中。优选的是,本实施例还可以通过对装在任务序列进行遍历可以批量生成URI的装载,以支持组件即插即用。综上所述,本发明通过开发新的规则动作模板以支持对命名栈的操 作,在动作模板的基础上开发一组新的规则动作,相应地,对原有 commons-digester的SAX解析器Digester进行扩展,支持对命名栈的操作, 并且,定义与规则动作对应的规则标签,开发XML规则脚本DTD、规则 对象工厂,扩展规则解析器以支持相应规则标签识别、从而触发规则对 象工厂的调用,实现规则标签到规则动作对象的转化。从而使本发明可 以适用各种XML标准报文格式,并且应用本发明的规则标签可以完成各 种复杂的解析动作,大大简化了XML配置文件与XML规则脚本的开发和 维护工作。其次,本发明无需额外生成配置文件描述与创建对象对应的 配置文件和规则脚本,有效节约了系统资源;再者,本发明通过遍历产 生装载任务,能批量生成uri的装载,从而支持配量处理与组件即插即用。 最后,本发明对于服务提供商来说,技术实现简单,无技术障碍,无特 殊保密算法,成本和风险较低。需要说明的是,对于前述的各方法实施例,为了简单描述,故将其 都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并 不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其 他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所 描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发 明所必须的。参考图3,示出了本发明的一种XML文件解析装置实施例的结构框 图,可以包括以下模块定义模块301,用于定义所述XML的标签与相应对象模型特征的映 射,所述对象模型特征具有配置属性,所述配置属性用于标识执行所述 对象模型特征的栈名;生成沖莫块302,用于生成由所述XML标签编写的XML文件,所述 XML文件包括装载任务对象脚本和组件对象脚本;关联模块303,用于提取所述组件对象脚本的URI,并依据所述URI 在所述装载任斧对象脚本和组件对象脚本之间建立关联;装载解析模块304,用于解析所述装载任务对象脚本,生成装载任务 序列,所述装载任务序列包括URI;遍历模块305,用于遍历所述装载任务序列,获得当前URI指定的组 件对象脚本;组件解析模块306,用于解析所述组件对象脚本,返回相应栈名对应 的栈顶组件对象。在本实施例中,优选的是,所述装载任务对象脚本包括装载对象配置 文件和装载规则脚本,在这种情况下,所述装载解析模块304可以进一 步包括以下子模块第一解析器产生子模块,用于依据所述装载规则脚本生成第一 SAX 解析器;第一SAX解析器,用于解析所述装载任务对象脚本。 相应地,所述组件对象脚本可以包括组件对象配置文件和组件MJ'J脚 本,在这种情况下,所述组件解析模块306可以进一步包括以下子模块 第二解析器产生子模块,用于依据所述组件规则脚本生成第二 SAX解析器;第二SAX解析器,用于解析所述组件对象脚本。更为优选的,所述组件解析模块306还可以进一步包括以下子模块建栈子模块,用于依据所述栈名设置空栈;压栈子模块,用于将相应的组件对象压入当前栈中;出栈子模块,用于提取栈顶组件对象出栈。在本实施例中,所述定义模块还可以包括标签映射子模块,用于将描 述所述对象模型特征的元模型特征映射到相应的XML标签。优选的是,本实施例还可以包括编码模块,用于将描述所述元模型特 征至所述XML标签的映射编码至所述SAX解析器中。对于装置实施例而言,由于其基本相应于方法实施例,所以描述的 比较简单,相关之处参见方法实施例的部分说明即可。以上对本发明所提供的一种XML文件解析的方法及一种XML文件解析的装置进行了详细介绍,本文中应用了具体个例对本发明的原理及 实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方 法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思 想,在具体实施方式
及应用范围上均会有改变之处,综上所述,本说明 书内容不应理解为对本发明的限制。
权利要求
1、一种XML文件解析的方法,其特征在于,包括定义所述XML的标签与相应对象模型特征的映射,所述对象模型特征具有配置属性,所述配置属性用于标识执行所述对象模型特征的栈名;生成由所述XML标签编写的XML文件,所述XML文件包括装载任务对象脚本和组件对象脚本;提取所述组件对象脚本的URI,并依据所述URI在所述装载任务对象脚本和组件对象脚本之间建立关联;解析所述装载任务对象脚本,生成装载任务序列,所述装载任务序列包括URI;遍历所述装载任务序列,获得当前URI指定的组件对象脚本;解析所述组件对象脚本,返回相应栈名对应的栈顶组件对象。
2、 如权利要求l所述的方法,其特征在于,所述装载任务对象脚本 包括装载对象配置文件和装载规则脚本,所述装载任务对象脚本的解析 步骤进一步包括依据所述装载规则脚本生成第一 SAX解析器; 由所述第一 SAX解析器解析所述装载任务对象脚本。
3、 如权利要求l或2所述的方法,其特征在于,所述组件对象脚本 包括组件对象配置文件和組件规则脚本,所述组件对象脚本的解析步骤 进一步包括依据所述组件规则脚本生成第二 SAX解析器; 由所述第二 SAX解析器解析所述组件对象脚本。
4、 如权利要求l所述的方法,其特征在于,通过以下步骤返回栈顶 组件对象依据所述栈名设置空栈;将相应的组件对象压入当前栈中;提取栈顶组件对象出栈。
5、 如权利要求3所述的方法,其特征在于,所述定义步骤还包括 将描述所述对象模型特征的元模型特征映射到相应的XML标签。
6、 如权利要求5所述的方法,其特征在于,还包括 将描述所述元模型特征至所述XML标签的映射编码至所述SAX解析器中。
7、 如权利要求6所述的方法,其特征在于,所述SAX解析器包括用 于在所述XML文件与对象模型特征之间进行转换的可执行代码。
8、 一种XML文件解析的装置,其特征在于,包括定义模块,用于定义所述XML的标签与相应对象模型特征的映射, 所述对象模型特征具有配置属性,所述配置属性用于标识执行所述对象 模型特征的栈名;生成4莫块,用于生成由所述XML标签编写的XML文件,所述XML 文件包括装载任务对象脚本和组件对象脚本;关联模块,用于提取所述组件对象脚本的URI,并依据所述URI在 所述装载任务对象脚本和组件对象脚本之间建立关联;装载解析模块,用于解析所述装载任务对象脚本,生成装载任务序列, 所述装载任务序列包括URI;遍历模块,用于遍历所述装载任务序列,获得当前URI指定的组件 对象脚本;组件解析模块,用于解析所述组件对象脚本,返回相应栈名对应的栈 顶组件对象。
9、 如权利要求8所述的装置,其特征在于,所述装载任务对象脚本 包括装载对象配置文件和装载规则脚本,所述装载解析模块进一步包括第一解析器产生子模块,用于依据所述装载规则脚本生成第一 SAX 解析器;第一SAX解析器,用于解析所述装载任务对象脚本。
10、 如权利要求8或9所述的装置,其特征在于,所述组件对象脚本 包括组件对象配置文件和组件规则脚本,所述组件解析模块进一步包括第二解析器产生子模块,用于依据所述组件规则脚本生成第二 SAX 解析器;第二SAX解析器,用于解析所述组件对象脚本。
11、 如权利要求8所述的装置,其特征在于,组件解析模块进一步包括建栈子模块,用于依据所述栈名设置空栈; 压栈子模块,用于将相应的组件对象压入当前栈中;出栈子模块,用于提取栈顶组件对象出栈。
12、 如权利要求IO所述的装置,其特征在于,所述定义模块还包括: 标签映射子模块,用于将描述所述对象模型特征的元模型特征映射到相应的XML标签。
13、 如权利要求12所述的装置,其特征在于,还包括 编码模块,用于将描述所述元模型特征至所述XML标签的映射编码至所述SAX解析器中。
全文摘要
本发明提供了一种XML文件解析的方法,包括定义所述XML的标签与相应对象模型特征的映射,所述对象模型特征具有配置属性,所述配置属性用于标识执行所述对象模型特征的栈名;生成由所述XML标签编写的XML文件,所述XML文件包括装载任务对象脚本和组件对象脚本;提取所述组件对象脚本的URI,并依据所述URI在所述装载任务对象脚本和组件对象脚本之间建立关联;解析所述装载任务对象脚本,生成装载任务序列,所述装载任务序列包括URI;遍历所述装载任务序列,获得当前URI指定的组件对象脚本;解析所述组件对象脚本,返回相应栈名对应的栈顶组件对象。本发明能在节省系统资源的前提下,简单、有效的实现XML文件配置及解析。
文档编号G06F17/22GK101221556SQ20081000606
公开日2008年7月16日 申请日期2008年2月1日 优先权日2008年2月1日
发明者吴炜斯, 周子坚, 健 施, 李志钧, 杜永键, 芬 杨, 林志农, 王迎春 申请人:中国建设银行股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1