论文部分内容阅读
本文范例是针对复杂的XML程序设计应用,提供部份的程序代码,以解释程序设计观念。本文假设读者已经具备XML APIs与Java程序设计经验。
本文讨论程序设计师使用XML与Java技术,XML Data Binding与传统撰写APIs或公用程序来转换XML文件,从分析XML文件结构、取出数据,以及转换成可用的数据格式的过程。提供国际标准组织开放行动联盟(Open Mobile Alliance;OMA) WV-IMPS,在XML转载无线数据交换讯息应用的范例说明。依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的DTD规范而窥探出的复杂程度,包括:使用了多份DTD 约制规则验证XML数据造成结构冲突的问题,以及XML文件格式元素排列的顺序,和元素型别相互成为多层果状且元素型别名称重复…等等复杂的问题与解决方法。
OMA WV-IMPS XML转载无线数据交换讯息简介
WV-IMPS简介
2001年Ericsson、Motorola、Nokia等手机大厂,共同成立了Wireless Village组织。主旨为制定适合于移动通信网路上使用之IMPS通信协议,使移动设备相互之间,或移动装置与其它通信设备间可以彼此交换实时信息与状态信息。亦即可在移动设备参与者间实时的交换各种媒体内容信息,并且可以实时知道参与者的状态信息,从而选择适当的方式进行交流。
官方网址与规格文件网址
本文依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的规范,说明在XML转载无线数据交换信息的应用。该文件提供DTD约制规则与交易的范例。官方网址http://www.openmobilealliance.org/;DTD规格文件(OM-WV-CSP_DTD-V1_1-20021001-A)网址http://www.openmobilealliance.org/release_program/docs/CopyrightClick.asp?pck=IMPS&file=OMA-WV-PA_DTD-V1_1-20021001-A.pdf。
XML Data Binding基本原理
基本原理
通常在解析XML数据时,经常利用W3C DOM tree或SAX event-driven APIs来剖析XML文件。程序设计师需要很清楚XML文件的结构,以便处理XML元素名称、字符,和属性…等新增、修改节点数据的操作。
XML Data Binding技术,其目标就是把一个XML文件模型同一个Java对象导向语言中的对象关联起来。这样程序设计师只需要对这个对象进行操作,并且操作结果就能直接地对映到XML文件档中。
例如我们解析一份递送讯息交易结果的XML文件,取得元素下用户的辨识码节点和屏幕名称节点的数据。如果要进一步处理的子元素数据,程序设计师还需要解析DOM Tree的元素与其子元素,以取得子元素的数据,再将它们转换成适当的Java数据型别。
XML DOM Tree
如果使用Data Binding技术,那么程序设计师只需获得这个节点所对应的对象模块,如DetailedResult Class,然后处理这个对象模块下UserID和ScreenName成员变量的值;或ScreenName Class,以及处理这个对象模块下SName和GroupID成员变量的值就可以了。如此可以简化解析DOM tree额外的程序代码,提高了程序开发的效率。
复杂的XML文件格式在程序设计上的问题与解决方法
依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的规范,包括:使用了多份DTD 约制规则验证XML数据造成结构冲突的问题,以及XML文件格式元素排列的顺序,和元素型别相互成为多层巣状且元素型别名称重复…等等复杂的问题,提供说明与解决方法。
使用了多份DTD 约制规则验证XML数据
1. 问题描述:
依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的DTD规范,虽然只有一份DTD文件型别定义檔(Document Type Definitions),却可分为三个部份DTD 的约制规则。为了说明,将此三部份分别归类为WV-CSP-Message元素所包含的部份、TransactionContent元素所包含的Presence部份,和TransactionContent部份中所包含非Presence的部份。这三个部份的约制规则在整合过程中,将因不同DTD的约制规则造成结构冲突的问题。
2. 解决方法:
使用DTD的条件式区段可以解决整合多份DTD的约制规则所造成结构冲突的问题。条件式区段内包含了二个主要的关键词“INCLUDE”与“IGNORE”,如果条件式区段的关键词是“INCLUDE”,则条件式区段的内容是DTD的一部份;如果条件段的关键词是“IGNORE”,则条件式区段的内容便不属于 DTD 逻辑上的一部份。
请参考下列“外部Doc Type宣告”内容:
以WV-CSP-Message.dtd来整合下列三份DTD的约制规则文件。
注:以WV-CSP-Header.dtd描述WV-CSP-Message元素所包含的部份,以WV-CSP-Body.dtd描述TransactionContent元素所包含的部份,以PresenceSubList.dtd描述TransactionContent部份中所包含的Presence部份,并以WV-CSP-Message.dtd来整合此三份DTD的约制规则文件。
宣告;
的宣告;
并且还需要在Java相关的对象模块转换(marshal)为XML文件的程序中,加入Presence交易的判断,并以下面“内部Doc Type宣告”来覆写“外部Doc Type宣告”中条件式区段内关键词“INCLUDE”与“IGNORE”的实体参照设定。如此,上述
XML文件格式元素型别相互成为多层巣状且元素型别名称重复
1. 问题描述:
依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的DTD规范,XML文件格式元素型别相互成为多层巣状且元素型别名称重复。请参考下面DTD规范的片段:
程序设计师可以依据此DTD规范,撰写对映的Java对象模型(object model),它是持有属性与getter-setter方法的一种Java Bean设计型态的类别。
但是根据这样的DTD规范,将使得Java程序在解析XML文件至Java object model时;或由Java object model产生XML文件时,容易因为XML元素名称同名造成覆写的错误情形发生。
2. 解决方法:
● 解析XML文件至Object Model:
为避免同名称元素被覆写的情形发生。程序必须能剖析XML元素,取得其下所有子元素的List,然后将XML元素List对映于Java object model。
上述JDOM APIs程序代码,首先取得Result类别object model的实体,并取得DeliveryReport的子元素的List,即Result子元素的List(范例第1至第2行)。然后透过for循环来剖析整个Result List,由resultChild.getName() 来判断是否为Code或是Description子元素。假如是Description元素,则取出该Description元素的字符值,然后设定至Result下Description的属性字段(范例第3至第7行)。
如果是DetailedResult元素的话,则取得DetailedResult的子元素的List(范例第5行),然后重复上述的方式,透过for循环继续来剖析整个DetailedResult List,取出元素的字符值至相对映的属性字段(范例第8行至39行)。
● 由Object Model产生XML文件:
程序设计师通常将欲产出XML文件格式,先设定为Java Properties组态档案的格式注3,然后程序直接转换成XML文件。为避免同名称元素被覆写的情形发生,必须将组态档案中每一个XML元素的型别名称,储存成类似XML位置路径的常数变量,然后程序转换对映于Map后,再转成XML文件。使得在解析XML文件时,能辨识每一个XML元素,使产出数据验证正确。
XML文件格式元素顺序排列的限制
1. 问题描述:
依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的DTD规范,元素宣告定义XML文件各子元素间出现顺序。程序设计师通常将欲产出XML文件格式,以Java组态档案的格式,对映至Java程序的 HashMap注1,然后再转换为XML文件。由于HashMap不保证数据依照置入Map的顺序储存数据,使得在对象模块转换为XML文件时,不能符合各子元素间出现顺序的限制。
2. 解决方法:
程序的 LinkedHashMap,并且依照XML文件各子元素间出现顺序,从Java相关的对象模块数据置入LinkedHashMap中。然后将对象模块转换为XML文件,即符合各子元素间出现顺序的限制。
注:程序设计师通常使用java.util.Properties或java.util.ResourceBundle Class存取组态档案,但是其数据结构是使用Hashtable作为储存方式,不保证依照数据置入的顺序储存。
框架程序设计的应用
说明
本文提供Castor XML Mapping对于XML Data Binding设计,解析XML文件至Object Model的应用实例。 Castor Framework是开放式源码,支持Java-to-XML 数据系结,与Java-to-SQL Persistence数据库应用设计注2。相关文件说明,请参考Castor官方网址http://www.castor.org;与Castor XML Mapping文件网址http://www.castor.org/xml-mapping.html。
Castor Framework的应用实例
本范例说明使用Castor XML Mapping对映档,以解析XML文件至Java对象模型的应用。
注:1.Java 语言的 XML 数据系结框架程序有:JAXB、JiBX、Castor、JBind、Quick 和 Zeus等等。
2.Castor 亦提供Source code generator工具,依照设计人员所提供的XML Schema 檔,
自动产生Java的对象模型。请参考Wrox Press Ltd. 专业XML程序设计 第二版第十五章 XML资料系结,或Castor官方网站相关说明。
首先我们依据上述的DTD规范,撰写对映的Java对象模型(object model),持有属性与getter-setter方法注3类别。
然后我们需要撰写Castor对映档。Castor对映档也是XML文件档,用来描述Java对象模型与XML文件如何产生关联的信息。
Castor对映档遵循一份XML的约制规则“http://castor.exolab.org/mapping.dtd“,以<mapping>元素包含类别的对映,并使用<include>含括其它相关的对映档。
类别的对映以<class>元素指定类别的完整套件名称,并包含多个属性字段对映。使用<map-to>元素指定类别名称对映至XML元素。
字段的对映则以<field>元素指定,描述字段名称与型态。并且以<bind-xml>元素指定字段对映为所指定的名称;使用node属性指明该字段对映类型为element(或是attribute、text)。
<bind-xml>元素亦提供location属性,用来指明该字段所对映至XML binding,表示由被指定的XML元素所含括(wrapping)。
当完成上述对映的Java对象模型与Castor 对映文件后,接着使用Castor 对映檔进行解析XML文件至Java对象模型的程序代码(Unmarshal)。
首先汇入Castor套件,并载入mapping文件(下页范例,第1至第5行)。加载mapping后,接着将使用Java类别DeliveryReportRequestPrimitive.class 建立unmarshaller(范例第6至第7行),并由unmashal处理所传入的XML Stream对象(范例第10至第12行)。
结论
一般来说,程序设计师常常使用SAX、DOM、JDOM等XML的APIs,对XML文件的架构与内容进行分析与应用。但是使用这样的APIs程序来处理上述复杂,或规模较大的XML文件时,需要投入较多的精力。尤其在维护这部份的程序代码相当乏味,并且因着XML文件结构复杂度增长,非常容易造成程序设计人员的疲乏而产生错误。
使用Castor 框架程序设计,可以解决复杂的XML的APIs程序设计的问题。Castor 框架程序设计,可以使我们将焦点集中在使用XML文件中的数据,将原本需要撰写应用程序来分析XML文件结构、存取数据,并转换成可用格式的烦人的剖析工作,变成非常便利的任务,使程序设计简化,因而更有效地使用数据数值。
参考文献
● OMA官方网址http://www.openmobilealliance.org/
● Castor官方网址http://www.castor.org/
● IBMdeveloperWorks 中国网站编辑组网址http://www-128.ibm.com/developerworks/cn/xml/theme/x-java.html
● O’Reilly & Associates, Inc. - 『XML与Java第二版 Java and XML, 2/e』 -第七章JDOM,第十五章 数据系结接口
● Pearson Education Taiwan Ltd. - 『XML与Java-开发WEB应用程序 第二版 XML and Java Second Edition Developing Web Applications』 - Chapter 8 数据结构与XML的桥梁,Chapter 15 资料系结
● Wrox Press Ltd. - 『专业XML程序设计 第二版 PROCESSIONAL XML 2nd Edition』 - 第十五章 XML资料。
本文讨论程序设计师使用XML与Java技术,XML Data Binding与传统撰写APIs或公用程序来转换XML文件,从分析XML文件结构、取出数据,以及转换成可用的数据格式的过程。提供国际标准组织开放行动联盟(Open Mobile Alliance;OMA) WV-IMPS,在XML转载无线数据交换讯息应用的范例说明。依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的DTD规范而窥探出的复杂程度,包括:使用了多份DTD 约制规则验证XML数据造成结构冲突的问题,以及XML文件格式元素排列的顺序,和元素型别相互成为多层果状且元素型别名称重复…等等复杂的问题与解决方法。
OMA WV-IMPS XML转载无线数据交换讯息简介
WV-IMPS简介
2001年Ericsson、Motorola、Nokia等手机大厂,共同成立了Wireless Village组织。主旨为制定适合于移动通信网路上使用之IMPS通信协议,使移动设备相互之间,或移动装置与其它通信设备间可以彼此交换实时信息与状态信息。亦即可在移动设备参与者间实时的交换各种媒体内容信息,并且可以实时知道参与者的状态信息,从而选择适当的方式进行交流。
官方网址与规格文件网址
本文依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的规范,说明在XML转载无线数据交换信息的应用。该文件提供DTD约制规则与交易的范例。官方网址http://www.openmobilealliance.org/;DTD规格文件(OM-WV-CSP_DTD-V1_1-20021001-A)网址http://www.openmobilealliance.org/release_program/docs/CopyrightClick.asp?pck=IMPS&file=OMA-WV-PA_DTD-V1_1-20021001-A.pdf。
XML Data Binding基本原理
基本原理
通常在解析XML数据时,经常利用W3C DOM tree或SAX event-driven APIs来剖析XML文件。程序设计师需要很清楚XML文件的结构,以便处理XML元素名称、字符,和属性…等新增、修改节点数据的操作。
XML Data Binding技术,其目标就是把一个XML文件模型同一个Java对象导向语言中的对象关联起来。这样程序设计师只需要对这个对象进行操作,并且操作结果就能直接地对映到XML文件档中。
例如我们解析一份递送讯息交易结果的XML文件,取得
XML DOM Tree
如果使用Data Binding技术,那么程序设计师只需获得这个节点所对应的对象模块,如DetailedResult Class,然后处理这个对象模块下UserID和ScreenName成员变量的值;或ScreenName Class,以及处理这个对象模块下SName和GroupID成员变量的值就可以了。如此可以简化解析DOM tree额外的程序代码,提高了程序开发的效率。
复杂的XML文件格式在程序设计上的问题与解决方法
依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的规范,包括:使用了多份DTD 约制规则验证XML数据造成结构冲突的问题,以及XML文件格式元素排列的顺序,和元素型别相互成为多层巣状且元素型别名称重复…等等复杂的问题,提供说明与解决方法。
使用了多份DTD 约制规则验证XML数据
1. 问题描述:
依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的DTD规范,虽然只有一份DTD文件型别定义檔(Document Type Definitions),却可分为三个部份DTD 的约制规则。为了说明,将此三部份分别归类为WV-CSP-Message元素所包含的部份、TransactionContent元素所包含的Presence部份,和TransactionContent部份中所包含非Presence的部份。这三个部份的约制规则在整合过程中,将因不同DTD的约制规则造成结构冲突的问题。
2. 解决方法:
使用DTD的条件式区段可以解决整合多份DTD的约制规则所造成结构冲突的问题。条件式区段内包含了二个主要的关键词“INCLUDE”与“IGNORE”,如果条件式区段的关键词是“INCLUDE”,则条件式区段的内容是DTD的一部份;如果条件段的关键词是“IGNORE”,则条件式区段的内容便不属于 DTD 逻辑上的一部份。
请参考下列“外部Doc Type宣告”内容:
以WV-CSP-Message.dtd来整合下列三份DTD的约制规则文件。
注:以WV-CSP-Header.dtd描述WV-CSP-Message元素所包含的部份,以WV-CSP-Body.dtd描述TransactionContent元素所包含的部份,以PresenceSubList.dtd描述TransactionContent部份中所包含的Presence部份,并以WV-CSP-Message.dtd来整合此三份DTD的约制规则文件。
宣告;
的宣告;
并且还需要在Java相关的对象模块转换(marshal)为XML文件的程序中,加入Presence交易的判断,并以下面“内部Doc Type宣告”来覆写“外部Doc Type宣告”中条件式区段内关键词“INCLUDE”与“IGNORE”的实体参照设定。如此,上述
XML文件格式元素型别相互成为多层巣状且元素型别名称重复
1. 问题描述:
依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的DTD规范,XML文件格式元素型别相互成为多层巣状且元素型别名称重复。请参考下面DTD规范的片段:
程序设计师可以依据此DTD规范,撰写对映的Java对象模型(object model),它是持有属性与getter-setter方法的一种Java Bean设计型态的类别。
但是根据这样的DTD规范,将使得Java程序在解析XML文件至Java object model时;或由Java object model产生XML文件时,容易因为XML元素名称同名造成覆写的错误情形发生。
2. 解决方法:
● 解析XML文件至Object Model:
为避免同名称元素被覆写的情形发生。程序必须能剖析XML元素,取得其下所有子元素的List,然后将XML元素List对映于Java object model。
上述JDOM APIs程序代码,首先取得Result类别object model的实体,并取得DeliveryReport的子元素的List,即Result子元素的List(范例第1至第2行)。然后透过for循环来剖析整个Result List,由resultChild.getName() 来判断是否为Code或是Description子元素。假如是Description元素,则取出该Description元素的字符值,然后设定至Result下Description的属性字段(范例第3至第7行)。
如果是DetailedResult元素的话,则取得DetailedResult的子元素的List(范例第5行),然后重复上述的方式,透过for循环继续来剖析整个DetailedResult List,取出元素的字符值至相对映的属性字段(范例第8行至39行)。
● 由Object Model产生XML文件:
程序设计师通常将欲产出XML文件格式,先设定为Java Properties组态档案的格式注3,然后程序直接转换成XML文件。为避免同名称元素被覆写的情形发生,必须将组态档案中每一个XML元素的型别名称,储存成类似XML位置路径的常数变量,然后程序转换对映于Map后,再转成XML文件。使得在解析XML文件时,能辨识每一个XML元素,使产出数据验证正确。
XML文件格式元素顺序排列的限制
1. 问题描述:
依据OM-WV-CSP_DTD-V1_1-20021001-A文件所制定的DTD规范,元素宣告定义XML文件各子元素间出现顺序。程序设计师通常将欲产出XML文件格式,以Java组态档案的格式,对映至Java程序的 HashMap注1,然后再转换为XML文件。由于HashMap不保证数据依照置入Map的顺序储存数据,使得在对象模块转换为XML文件时,不能符合各子元素间出现顺序的限制。
2. 解决方法:
程序的 LinkedHashMap,并且依照XML文件各子元素间出现顺序,从Java相关的对象模块数据置入LinkedHashMap中。然后将对象模块转换为XML文件,即符合各子元素间出现顺序的限制。
注:程序设计师通常使用java.util.Properties或java.util.ResourceBundle Class存取组态档案,但是其数据结构是使用Hashtable作为储存方式,不保证依照数据置入的顺序储存。
框架程序设计的应用
说明
本文提供Castor XML Mapping对于XML Data Binding设计,解析XML文件至Object Model的应用实例。 Castor Framework是开放式源码,支持Java-to-XML 数据系结,与Java-to-SQL Persistence数据库应用设计注2。相关文件说明,请参考Castor官方网址http://www.castor.org;与Castor XML Mapping文件网址http://www.castor.org/xml-mapping.html。
Castor Framework的应用实例
本范例说明使用Castor XML Mapping对映档,以解析XML文件至Java对象模型的应用。
注:1.Java 语言的 XML 数据系结框架程序有:JAXB、JiBX、Castor、JBind、Quick 和 Zeus等等。
2.Castor 亦提供Source code generator工具,依照设计人员所提供的XML Schema 檔,
自动产生Java的对象模型。请参考Wrox Press Ltd. 专业XML程序设计 第二版第十五章 XML资料系结,或Castor官方网站相关说明。
首先我们依据上述的DTD规范,撰写对映的Java对象模型(object model),持有属性与getter-setter方法注3类别。
然后我们需要撰写Castor对映档。Castor对映档也是XML文件档,用来描述Java对象模型与XML文件如何产生关联的信息。
Castor对映档遵循一份XML的约制规则“http://castor.exolab.org/mapping.dtd“,以<mapping>元素包含类别的对映,并使用<include>含括其它相关的对映档。
类别的对映以<class>元素指定类别的完整套件名称,并包含多个属性字段对映。使用<map-to>元素指定类别名称对映至XML元素。
字段的对映则以<field>元素指定,描述字段名称与型态。并且以<bind-xml>元素指定字段对映为所指定的名称;使用node属性指明该字段对映类型为element(或是attribute、text)。
<bind-xml>元素亦提供location属性,用来指明该字段所对映至XML binding,表示由被指定的XML元素所含括(wrapping)。
当完成上述对映的Java对象模型与Castor 对映文件后,接着使用Castor 对映檔进行解析XML文件至Java对象模型的程序代码(Unmarshal)。
首先汇入Castor套件,并载入mapping文件(下页范例,第1至第5行)。加载mapping后,接着将使用Java类别DeliveryReportRequestPrimitive.class 建立unmarshaller(范例第6至第7行),并由unmashal处理所传入的XML Stream对象(范例第10至第12行)。
结论
一般来说,程序设计师常常使用SAX、DOM、JDOM等XML的APIs,对XML文件的架构与内容进行分析与应用。但是使用这样的APIs程序来处理上述复杂,或规模较大的XML文件时,需要投入较多的精力。尤其在维护这部份的程序代码相当乏味,并且因着XML文件结构复杂度增长,非常容易造成程序设计人员的疲乏而产生错误。
使用Castor 框架程序设计,可以解决复杂的XML的APIs程序设计的问题。Castor 框架程序设计,可以使我们将焦点集中在使用XML文件中的数据,将原本需要撰写应用程序来分析XML文件结构、存取数据,并转换成可用格式的烦人的剖析工作,变成非常便利的任务,使程序设计简化,因而更有效地使用数据数值。
参考文献
● OMA官方网址http://www.openmobilealliance.org/
● Castor官方网址http://www.castor.org/
● IBMdeveloperWorks 中国网站编辑组网址http://www-128.ibm.com/developerworks/cn/xml/theme/x-java.html
● O’Reilly & Associates, Inc. - 『XML与Java第二版 Java and XML, 2/e』 -第七章JDOM,第十五章 数据系结接口
● Pearson Education Taiwan Ltd. - 『XML与Java-开发WEB应用程序 第二版 XML and Java Second Edition Developing Web Applications』 - Chapter 8 数据结构与XML的桥梁,Chapter 15 资料系结
● Wrox Press Ltd. - 『专业XML程序设计 第二版 PROCESSIONAL XML 2nd Edition』 - 第十五章 XML资料。