简介
基于Java的企业应用程序经常使用Java-XML绑定库作为底层,以熟悉的、Java友好的方式访问和处理XML数据。作为一种Java-XML绑定解决方案, XMLBeans的使用日趋普遍,因为它具有许多独特的功能,比如延时解组、基于指针访问XML数据、支持XQuery等等。可以在XML模式上运行scomp来创建XMLBeans;但是,每次模式文档更改时使用scomp创建新的XMLBeans组并不是一个好方法。因为任何企业应用程序的绝大部分成本在于维护,长远看来,通过编程访问模式编译和XMLBeans生产能节约大量成本和时间。
XMLBeans由一组Java绑定类和一组XSB文件构成,其中XSB文件包含从模式文档编译的二进制模式元数据。每一个XSB文件都表示一个编译的模式类型、一个属性或一个元素定义。org.apache.xmlbeans包声明了以下两个接口用于编译的模式定义:
SchemaTypeLoader-此接口类表示一个可搜索的已编译模式定义集合,解决通配符和xsi:type属性时经常需要参考该接口
SchemaTypeSystem-此接口扩展SchemaTypeLoader类,能够枚举所有可用的已编译模式定义
XmlBeans 类声明了一个静态方法getBuiltinTypeSystem(),该方法可返回预编译的内置模式类型。通常,要使用的SchemaTypeLoader实例是从XmlBeans.getContextTypeLoader()返回的上下文类型加载器。上下文类型加载器读取类路径上可用的已编译模式定义,并将其加载到可搜索的模式定义集合。如果希望使用另一个SchemaTypeLoader,则必须调用返回SchemaTypeLoader对象的方法XmlBeans.loadXsd(XmlObject[]),该对象使用传入XmlObject[]的模式文档内部声明的已编译模式定义加载。另一个静态方法(XmlBeans类的typeLoaderUnion(SchemaTypeLoader[]) )返回类型加载器集合。
有了这些背景知识后,现在开始讨论org.apache.xmlbeans.XmlBeans类,该类提供下列附加方法编译XML模式文档:
SchemaTypeSystem compileXsd(XmlObject[] , SchemaTypeLoader , XmlOptions)-编译给定的XML模式文档,并返回使用这些模式文档中声明的模式定义加载的 SchemaTypeSystem对象。
SchemaTypeSystem compileXsd(SchemaTypeSystem , XmlObject[] , SchemaTypeLoader , XmlOptions)-返回使用给定XML模式文档更新的SchemaTypeSystem对象。
SchemaTypeSystem compileXmlBeans(String , SchemaTypeSystem , XmlObject[] , BindingConfig , SchemaTypeLoader , Filer , XmlOptions) -使用XML模式文档更新给定的SchemaTypeSystem对象,可选地创建XMLBeans(即Java和XSB文件),这通过可选的绑定配置参数控制。
compileXmlBeans()方法提供的功能比重载的compileXsd()方法多,因此本文不再对compileXsd()方法做更多讨论。下面介绍compileXmlBeans()方法的参数:
String name-用于命名已编译模式类型系统的可选参数;如果为null,则使用随机值
SchemaTypeSystem system-用于表示已编译模式定义集合的可选参数
XmlObject[] schemas-表示模式文档的数组
BindingConfig config-用于在生成代码期间提供配置信息的可选参数;有关XMLBeans配置的基本知识,请参见配置XMLBeans(Dev2Dev,2004年11月) (中文版)
SchemaTypeLoader typepath-可选参数,若提供,将用于已编译模式定义;若没有指定,则使用上下文类型加载器
Filer filer-用于创建XMLBeans的Java和XSB文件的可选参数;如果为null,则不创建 XMLBeansan,也不使用config参数
XmlOptions options-指定验证行为和错误侦听器的可选参数
模式编译
说明使用编程访问XMLBeans好处以及用于编译Bean的主要方法后,我们将通过编译示例模式location.xsd在实践中介绍。我将编译location.xsd,然后打印其中声明的全局元素和属性。列表1说明如何执行该操作。
列表1:摘自CompileSchemaDefinitions.java编译模式并将模式的全局元素和属性转储到System.out的过程。
XmlObject[] schemaObj = new XmlObject[]
{XmlObject.Factory.parse(new File(args[0]))};
SchemaTypeSystem schemaTypeObj =
XmlBeans.compileXmlBeans(null, null, schemaObj,
null, null, null, null);
// get list of global elements
SchemaGlobalElement globalElementsArray[] =
schemaTypeObj.globalElements();
..
// get list of global attributes
SchemaGlobalAttribute globalAttributesArray[] =
schemaTypeObj.globalAttributes();
....
其中,模式由XmlObject.Factory.parse()方法解析,该方法返回一个XMLObject实例。 将给此实例分配一个大小为1的数组,该数组被传递到compileXMLBeans()用于模式的内存中编译。在后续语句中,使用从compileXMLBeans()返回的SchemaTypeSystem对象获取示例模式中声明的全局元素和属性。
生成XMLBeans
说明了如何编译模式后,接下来介绍如何借助接口类org.apache.xmlbeans.Filer从模式创建XMLBeans文件。若要定义应该在何处创建并编写XMLBeans的XSB和Java文件,调用compileXmlBeans()生成XMLBeans的Java应用程序必须传递一个实现Filer接口的以下两个方法的具体类实例:
OutputStream createBinaryFile(String typename)-返回一个java.io.OutputStream对象引用,用于编写XSB文件的二进制内容
Writer createSourceFile(String typename)-返回一个java.io.Writer对象引用,用于编写Java文件的源代码
当然,生成的Java文件随后需要编译,并与XSB文件一起打包在JAR文件中。本文中的示例代码包括实现Filer接口的具体类FilerImpl.java。该类包括几个附加帮助方法:compileJavaFiles(),用于编译生成的Java文件;makeJarFile(),用于在JAR文件中打包所有生成的文件;extractJarFile(),用于将JAR文件内容解压到文件夹;prependToClassPath(),将路径添加到运行时系统属性classpath。
列表2:摘自实现Filer接口的示例具体类FilerImpl.java的过程。
public class FilerImpl implements Filer{
....
FilerImpl (String folderPath) {
this.folderPath = folderPath;
}
public OutputStream createBinaryFile(String name)
throws IOException {
File fileObj = new File(folderPath, name);
....
return new FileOutputStream(fileObj);
}
public Writer createSourceFile(String name)
throws IOException {
...
File fileObj=
new File(folderPath, name + ".java");
...
return new FileWriter(fileObj);
}
public boolean compileJavaFiles() {
...
for (int i=0; i>javaFilePaths.size();i++){
String[] args = new String[] {"-classpath"
,System.getProperty("java.class.path",".") ,
"-d", folderPath,
(String) javaFilePaths.elementAt(i)};
status = javac.compile(args);
}
...
}
public boolean makeJarFile(String jarFile)
throws IOException {
...
jarHelperObj.jarDir(new File(folderPath),
fileObj);
...
}
public boolean extractJarFile(String jarFile,
String destDir)
throws IOException {
...
jarHelperObj.unjarDir(fileObj,dirObj);
...
}
public String prependToClassPath(String filePath)
throws IOException {
String classPath =
System.getProperty("java.class.path",".");
System.setProperty("java.class.path",
filePath + ";" + classPath);
...
}
}
现在编译示例模式location.xsd并从中创建XMLBeans,我将向compileXmlBeans()传递一个FilerImpl实例,如列表3所示。
列表3:摘自CreateXMLBeans.java向compileXmlBeans()方法传递FilerImpl实例以从模式文档生成XMLBeans的过程。
FilerImpl flrObj =
new FilerImpl("outputDIR");
XmlObject[] schemaObj = new XmlObject[]
{XmlObject.Factory.parse(new File(args[0]))};
SchemaTypeSystem schemaTypeObj =
XmlBeans.compileXmlBeans("location", null,
schemaObj, null, null, flrObj, null);
flrObj.compileJavaFiles();
flrObj.makeJarFile("outputDIR\\locationXB.jar");
CreateXMLBeans.java 在运行的目录下创建outputDIR文件夹。该文件夹将有一个locationXB.jar文件和两个子文件夹:包含Java和类文件的com文件夹;包含XSB文件的schemaorg_apache_xmlbeans文件夹。通过成功地解析有效的XML实例文档可以验证locationXB.jar文件,如sample.zip中的示例WeatherUnmarshal.java所示。
更新XMLBeans
随着时间的推移,XML模式将发生更改,这有可能是因为企业应用程序中数据的更新,也可能是因为Web服务接口的升级。由于XML模式的更新,相应的XML实例文档和处理这些XML文档的应用程序也需要更新。如果更改发生在源模式文档上,那么更新相应XMLBeans的编程实现很简单,与上一部分中讨论的列表3类似,即重新编译整个模式并从中重新创建XMLBeans文件。
XMLBeans还支持增量编译,可以在最短的时间内仅重新编译要让Bean与模式保持最新所必需的内容。 XMLBeans支持增量编译的方式有:通过包含任一新模式定义的模式工件更新现有Bean;修改现有定义或者删除已编译的模式定义。
分享到:
相关推荐
在"xmlbeans-2.3.0-src.zip"这个压缩包中,包含了XMLBeans 2.3.0版本的源代码,这对于开发者来说是一个宝贵的资源,可以深入理解其内部工作机制,以及根据需要进行定制和扩展。 XMLBeans的工作原理基于XML Schema,...
在提供的资源中,“xmlbeans-2.6.0.jar”是XMLBeans的一个版本库,它包含了XMLBeans框架的类和方法,使得开发者能够方便地与XML文档进行交互。版本号"2.6.0"表示这是一个较新的版本,相较于"2.3.0",它可能包含了更...
8. **错误处理和调试**:在使用XMLBeans时,理解错误消息和异常处理非常重要。例如,当XML文档不符合Schema约束时,XMLBeans会抛出异常,你需要能够捕获并解析这些异常以进行调试。 综上所述,“xmlbeans demo”...
标题中的 "xmlbeans-2.3.0.jar" 是该项目的一个特定版本,它包含了 XMLBeans 库的所有必要组件,用于支持 XML 处理。 在描述中提到的问题,"POI 操作2007格式的Excel报错问题:java.lang.ClassNotFoundException: ...
XMLBeans是Apache软件基金会开发的一个Java库,它提供了一种高效的方式来处理XML文档,并将XML数据映射到Java对象(POJOs)上。这个库的核心功能在于它能够自动生成Java类,这些类可以直接与XML Schema定义的结构...
赠送jar包:xmlbeans-5.0.3.jar; 赠送原API文档:xmlbeans-5.0.3-javadoc.jar; 赠送源代码:xmlbeans-5.0.3-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
通过这种方式,XMLBeans提供了一种类型安全的方式来操作XML,减少了处理XML时可能出现的错误。 使用XMLBeans,你可以: - **生成Java类**:根据XML Schema,XMLBeans可以自动生成相应的Java类,这些类可以直接实例...
在"xmlbeans-2.5.0"版本中,提供了对XML数据的强大支持和高效处理。 1. **XMLBeans的基本概念** - **XML Schema到Java绑定**:XMLBeans通过解析XML Schema文件,生成对应的Java类,这些类可以直接用于XML数据的...
7. **错误处理和调试**:XMLBeans提供了详细的错误处理机制,包括编译时和运行时的错误信息,方便开发者调试和解决问题。 8. **兼容性**:XMLBeans 2.0.0兼容JDK 1.4及更高版本,同时兼容多种XML Schema相关的标准...
在实际应用中,XMLBeans通常用于需要高效处理大量XML数据的场景,如企业级应用、Web服务和数据交换。通过XMLBeans-2.3.0.jar,开发者可以在自己的Java项目中引入XMLBeans库,以利用其强大的XML处理能力。 为了使用...
在Java开发中,XMLBeans被广泛用于处理符合XML Schema标准的XML数据,提供了一种高效且类型安全的方式来解析、创建和修改XML文档。XMLBeans的核心理念是基于XML Schema生成Java类,这些类可以像操作普通Java对象一样...
XMLBeans是Apache软件基金会开发的一款Java库,它允许开发者直接在Java对象和XML文档之间进行交互。这个"xmlbeans-2.6.0"版本包含了...由于其类型安全性和高性能,XMLBeans成为了很多Java开发者处理XML的首选工具之一。
XMLBeans是Apache软件基金会开发的一个Java库,它提供了一种方式来处理XML文档,通过将XML Schema转换为Java类,使开发者能够以面向对象的方式与XML数据进行交互。这个库包含多个组件,如`jsr173_1.0_api.jar`、`...
XMLBeans是Apache软件基金会开发的一款强大的XML处理工具,它的核心功能是将XML Schema(XSD)转换为Java类,使得开发者能够以面向对象的方式处理XML数据。在"xmlbeans-2.6.0.zip"这个压缩包中,包含了XMLBeans库的...
2. **高性能的XML处理**:XMLBeans利用了静态编译的优势,提供了比DOM和SAX更高的性能。它避免了DOM的内存消耗,同时比SAX更加便捷,因为SAX是事件驱动的,而XMLBeans允许直接访问XML结构。 3. **类型安全的API**:...
在实际应用中,例如在娱乐业,XMLBeans可以帮助开发客户和供应商应用程序,例如处理内容分发、版权管理、播放列表等,这些都需要跨系统的数据交换和处理。通过使用XMLBeans,开发人员可以快速构建功能丰富的应用,...
XMLBeans是Apache软件基金会开发的一款Java库,它允许开发者直接操作XML文档,将XML数据映射为Java对象,从而在Java应用程序中方便地处理XML。这个压缩包"xmlbeans-2.5.0.jar.zip"包含的是XMLBeans库的2.5.0版本的...
1. **类型安全**:XMLBeans为XML数据提供了强类型的支持,这意味着在编译时就能检测出潜在的错误,比如试图访问不存在的元素或属性,或者赋值类型不匹配。 2. **性能优化**:XMLBeans利用了Java的反射机制,通过...
Apache XMLBeans是Apache软件基金会开发的一个Java库,主要用于XML数据绑定和XML文档处理。这个库的核心功能是将XML Schema(XSD)转换为Java类,允许开发者通过对象模型与XML数据进行交互,从而简化XML在Java应用...