答案:如今似乎任何的软件开发都离不开XML技术支持,在图形图像、数据库、加密安全、软件工程、网络教育、电子商务、语音技术上都有XML施展拳脚的地方,XML应用大潮已经来临。
XML工作小组创始会员C.M. Sperberg-McQueen认为:“XML最大的影响在于XML软件大量兴起:XML剖析器、XML程序语言库、XSLT处理器、XSL FO处理器、数据库接受XML—不只如此,还有网络浏览器也接受XML。”也正因为如此,IBM、微软、SUN、惠普、Oracle等大公司纷纷进入这个市场。
在学会了XGen等对象绑定工具后,相信大家已经是跃跃欲试,希望立刻用XGen来实战一下,体验一下XML对象绑定的优势。下面就介绍一下我经常用到的XML应用。
1. XML配置文件
每个系统可能都需要或大或小的配置文件,通过配置文件来初始化系统的参数,好处不用详细介绍了。一般配置文件的格式有以下种:
1. window系统中ini格式文件和Java语言中使用的Properties文件
2. XML格式的文件
3. 其他格式文件
第一种类型的配置文件是纯文本文件,基本采用“key = value”的格式来记录各种参数,便于手工书写和阅读。
基于XML Schema的XML文件易于阅读,并且能非常好的显示各个元素之间的层次关系和约束关系。相对于ini文件格式使用xml格式的配置文件有以下优点:
1.1. 配置具有层次性
1.2. 取值有效性检查
1.3. 支持链表,枚举,复杂数据类型
1.4. 配置文件可以嵌套
1.5. 结合XML Spy 等XML编辑工具编辑配置文件十分便捷
1.6. 存在大量第三方的XML对象绑定工具,并且功能强大、开发便捷。如Java语言版的XGen、JAXB,C++版工具 XBind
现在就使开始实践使用XML作为程序使用的配置文件吧。
1.1. 设计XSD文件(XML Schema)
XGen需要编译的是XSD文件,XSD文件是用来描述指定类型的XML文件的大纲文件,是个纯文本文件。通过本文编辑工具就可以手工创建、编辑XSD文件,但是通过一些XML编辑工具可以事半功倍的完成XSD编写工作。我也用过一些XML编辑工具,但是只有XML SPY的功能最强大,并且使用非常方便。
XML Spy 的一些特性:
l 在编辑XML、XSD等文件时具有提示输入功能,可以非常方便的选择。
l 同时具有XML文件合法性校验功能,可以判断Element值的取值是否符合schema的定义。
l 支持DTD和XSD互转
l 提供XSD的样例XML实例文件功能
l 同样支持java,c++,c#的xml绑定,可以生成Java,c++和C#代码,不要太强大哦!
通过XML Spy编写AlertServer.xsd 文件
<?xml version="1.0"?>
<xsd:schema targetNamespace="urn:com:lianchuang:smartsecurer:alert:config:configfile.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:com:lianchuang:smartsecurer:alert:config:configfile.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified" >
<xsd:element name="Config" type="ConifgType"/>
<xsd:complexType name="ConifgType">
<xsd:sequence>
<xsd:element ref="Globe"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="Globe" type="GlobeType"/>
<xsd:complexType name="GlobeType">
<xsd:sequence>
<xsd:element ref="AlertServer"/>
<xsd:element ref="VOManager" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="AlertServer" type="AlertServerType"/>
<xsd:complexType name="AlertServerType">
<xsd:sequence>
<xsd:element name="ID" type="xsd:int"/>
<xsd:element name="Address" type="xsd:string" default="127.0.0.1" minOccurs="0"/>
<xsd:element name="Port" type="xsd:int" default="1099" minOccurs="0"/>
<xsd:element name="AlertServerName" type="xsd:string" minOccurs="0"/>
<xsd:element name="RegisterInterval" type="xsd:int" default="1000" minOccurs="0"/>
<xsd:element name="CacheSize" type="xsd:int" default="10000" minOccurs="0"/>
<xsd:element name="DeliverThreadNum" type="xsd:int" default="2" minOccurs="0"/>
<xsd:element ref="DBOperMode" default="Default" minOccurs="0"/>
<xsd:element name="BatchDBInsertSize" type="xsd:int" default="1000" minOccurs="0"/>
<xsd:element name="StatisticsInterval" type="xsd:int" default="1000" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="VOManager" type="VOManagerType"/>
<xsd:complexType name="VOManagerType">
<xsd:sequence>
<xsd:element name="Address" type="xsd:string"/>
<xsd:element name="Port" type="xsd:int" default="1099" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="DBOperMode">
<xsd:易做图Type>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Default"/>
<xsd:enumeration value="Native"/>
</xsd:restriction>
</xsd:易做图Type>
</xsd:element>
</xsd:schema>
注意 <xsd:schema> 设置
elementFormDefault="qualified" attributeFormDefault="unqualified" 属性
,否则在unmarshal(InputStream ,valid)方法调用中会有异常。这样设置表示限制局部元素和属性,即对每个局部的元素都要设定前缀。
当将 elementFormDefault 设置为 qualified 时,它表示在该语法的实例中,必须使用前缀或通过设置 {默认命名空间} 来显式限定所有元素。unqualified 设置意味着只有全局声明的元素才必须被显式限定,而局部声明的元素不得被限定。在此情形下,限定一个局部声明是错误的。同样,将 attributeFormDefault 设置为 qualified 时,必须使用前缀显式限定实例文档中的所有属性。
1.2. 创建Java对象
进入xgen安装目录,为了省事将AlertServer.xsd文件拷贝到该目录下。执行以下脚本:
xgen AlertServer.xsd
在当前目录下,会按照urn 路径生成 com\lianchuang\smartsecurer\alert\config\configfile_xsd 目录,并且新创建的class文件就保存在该目录下。若在XSD中定义了自定义复杂类型数据,则会在 configfile_xsd
目录下创建 \type 目录,并把相关的Java Class 放在该目录下。
1.3. 编写代码
对于定义XSD文档,每个复杂类型的ElementA,会有ElementA和ElementATypeComplexType类来作为该Java类的映射,通过getElementATypeComplexType()方法直接可以获取获取ElementA的复杂对象类型的引用。
如在XSD文件中的Globe,可以通过XXX.getConifgTypeComplexType().getGlobe()来获取该Java对象,通过config.getConifgTypeComplexType().getGlobe().getGlobeTypeComplexType()来获取实际的该类型的对象。
对于一些基本类型Element。XGen定义了一些X开头的类与之对应,如int,用XInt表示。可以通过new XInt(int i)来构造XInt对象。
// 下面是读取指定的配置文件,返回 Java 对象的代码
public static synchronized Config getConfig(String fileName) throws
FileNotFoundException
{
// 创建InputStream对象
File file = new File(fileName);
FileInputStream ins = new FileInputStream(file);
ChainedEntityResolver er = new ChainedEntityResolver();
Unmarshaller un = new Unmarshaller(er);
GlobalElement ge = null;
try
{上一个:JAVA的XML编程(dom)
下一个:用Applet读写XML配置文件