增量编译
现在我将添加一个在示例location_add.xsd中声明的新全局元素Latlong,然后对locationXB.jar)中的Bean应用Weather元素(在示例工件location_modify.xsd中声明)已修改的定义。
列表4:摘自location_modify.xsd显示已修改的Weather元素定义,并添加两个本地元素FeelsLike和Winds的过程。
..
<xsd:element name="Weather">
<xsd:complexType>
<xsd:sequence>
...
<xsd:element name="FeelsLike"
type="xsd:float"/>
...
<xsd:element name="Visibility"
type="xsd:float"/>
...
</xsd:complexType>
</xsd:element>
列表5中的摘要显示将包含XMLBeans的JAR文件的路径添加到系统属性classpath,以便上下文类型加载器可以从该JAR文件中加载已编译的模式定义,然后通过调用XmlBeans.typeLoaderUnion()方法,将这些已编译的模式定义与从XmlBeans.getBuiltinTypeSystem()返回的预编译内置模式类型结合起来。.结合的模式定义被分配到变量stl,调用compileXMLBeans()方法时使用该变量来根据模式工件更新XMLBeans。
列表5:摘自IncrementalCompilation.java
class IncrementalCompilation{
...
public static void main(String args[]) {
...
flrObj.extractJarFile(
args[oldJARFileArgPosition],
args[outputFolderPathPosition] );
flrObj.prependToClassPath(
args[outputFolderPathPosition]);
SchemaTypeLoader stl =
XmlBeans.typeLoaderUnion(
new SchemaTypeLoader[]
{ XmlBeans.getContextTypeLoader(),
XmlBeans.getBuiltinTypeSystem() });
...
for (int i =updatedXSDFileArgPosition,
j=0; j < updatedXSDDefinitionsSize;
i++,j++ ) {
updatedXSDObj[j] =
XmlObject.Factory.parse(
new File(args[i]),options);
}
augSTSObj = XmlBeans.compileXmlBeans(null,
null,updatedXSDObj , null,
stl, flrObj, options);
}
flrObj.compileJavaFiles();
flrObj.makeJarFile(args[newJARFileArgPosition]);
...
}
IncrementalCompilation.java需要输出文件夹的位置信息,将在该文件夹中创建XSB和Java文件,创建时使用打包更新Bean的FilerImpl.java JAR文件、现有Bean的JAR文件、按增量编译中应用的顺序排列的模式工件。下面是一个通过命令行调用IncrementalCompilation.java的示例,其中先编译location_add.xsd中声明的模式定义,然后是location_modify.xsd中声明的模式定义,更新outputDIR\locationXB.jar中的Bean,然后更新
outputDIR\locationXB_IncrementalCompilation.jar中打包的Bean:
java -classpath %CLASSPATH%;.\outputDIR\locationXB.jar;
IncrementalCompilation outputDIR
outputDIR\locationXB_IncrementalCompilation.jar
outputDIR\locationXB.jar location_add.xsd location_modify.xsd
通过成功解析weather或latlong XML实例文档,可以验证IncrementalCompilation.java创建的JAR文件,如示例下载中的WeatherUnmarshal.java和LatlongUnmarshal.java所示。该示例还包含UpdateUsingXSD.java,用于说明应用于源XML模式的增量编译。UpdateUsingXSD.java, compileXMLBeans()先被调用来编译源模式文件,然后用于对包含已修改模式定义的工件进行增量编译。
XML模式验证
使用scomp或Ant任务,或者使用compileXsd()和compileXmlBeans()方法调用进行编译时,XMLBeans会验证模式文档。但是,当使用编程方式编译模式时,XMLBeans API会对验证进行更多控制。通过对传递给compileXmlBeans()或重载compileXsd()方法的XMLOptions实例调用setCompileNoValidation(),可以关闭模式验证。
如果模式无效,则XMLBeans抛出XmlException异常。在实际生活中,生产系统应用程序应该提供友好的错误消息来提供错误详细信息并指示用户如何处理,因此XmlOptions类允许应用程序指定一个Collection实例来捕获并存储以XmlError对象形式返回的验证错误。 XmlError实例表示XML文档中特定位置的错误,它带有错误详细信息,如出错位置的行号和列号、简短说明和错误的严重性等等。XmlOptions 类为验证错误提供下列帮助方法:
setErrorListener (Collection)-设置一个Collection实例来捕获并存储验证期间发生的错误
setLoadLineNumbers()-从模式或XML文档创建XmlObject实例期间为开始标记标上行号;之后可以用于在XmlError实例出错的位置设置行号。
setLoadLineNumbers(String tag)-从模式或XML文档创建XmlObject实例期间为开始和结束标记(取决于tag参数的值)标上行号
现在已经熟悉了验证和错误处理API,在解析无效示例模式location_invalid.xsd的过程中我们将使用它们。我将展示如何在运行中处理验证错误并生成自定义错误消息。列表7 显示了如何捕获模式编译过程中抛出的XmlException异常,然后将验证错误集合传递到CustomErrorHandlingUtil 类,供自定义错误处理和报告使用。
列表7:摘自CustomErrorSample.java
class CustomErrorSample{
public static void main(String args[]) {
Collection errorList = new ArrayList();
XmlOptions parseOptionsObj = new XmlOptions();
parseOptionsObj.setLoadLineNumbers();
parseOptionsObj.setLoadLineNumbers(
XmlOptions.LOAD_LINE_NUMBERS_END_ELEMENT);
XmlOptions loadOptionsObj = new XmlOptions();
loadOptionsObj.setErrorListener(errorList);
try {
XmlObject[] schemaObj = new XmlObject[]
{XmlObject.Factory.parse(
new File(args[0]),parseOptionsObj)};
SchemaTypeLoader schemaTypeObj =
XmlBeans.loadXsd(schemaObj,
loadOptionsObj);
}catch (XmlException xme) {
CustomErrorHandlingUtil eUtilObj =
new CustomErrorHandlingUtil();
eUtilObj.handleXMLException(xme);
Collection userErrors =
(Collection)loadOptionsObj.get(
XmlOptions.ERROR_LISTENER);
eUtilObj.handleErrorCollection(
userErrors);
}
....
}
为了便于说明,在以上代码中使用了两个不同的XmlOptions实例;也可以只使用一个XmlOptions实例执行组合工作。从模式文档创建XmlObjects期间使用了parseOptionsObj。loadOptionsObj用于设置错误侦听器,以在模式编译期间保存验证错误。如果调用XmlObject.Factory.parse()期间没有传递parseOptionsObj,则验证错误的行号和列号将被设置为-1。
XML文档验证
默认情况下,解析期间或更新XMLBeans实例时XMLBeans不执行完整的XML实例文档验证。但是,应用程序可以调用XMLObject中一个重载的validate()方法强制执行验证:
boolean validate()-如果调用此方法的XMLObject实例符合相应的模式定义,则返回true
boolean validate(XmlOptions)-使用XmlOptions实例验证,如果调用此方法的XmlOptions实例符合相应的模式定义,则返回true
XmlOptions类提供以下两个方法在执行validate(XmlOptions)方法期间控制验证:
setValidateTreatLaxAsSkip()-跳过匹配定义的元素的验证,并将contentModel设置为lax
setValidateOnSet()-对每一个只表示简单类型的XMLBeans的getter和setter方法都将验证值。如果出现无效值,则抛出异常。请注意,此方法不能使用错误侦听器,而且此方法不验证使用XmlCursor做出的更改
举例来说,假设对全局元素Weather的Bean实例调用validate()方法。验证的范围将是整个Weather元素,包括其子元素。但是,如果对某一个局部元素(如Temperature)的Bean实例调用validate()方法,那么仅验证表示Temperature元素的实例Bean。列表8显示了如何验证整个XML实例文档并捕获验证错误以用于报告。
列表8:摘自WeatherUnmarshal.java
public class WeatherUnmarshal {
public static void main(String args[]) {
ArrayList errorList = new ArrayList();
...
optionsObj.setErrorListener(errorList);
try {
...
WeatherDocument weatherDoc =
WeatherDocument.Factory.parse(
inputXMLFile,optionsObj);
if (weatherDoc.validate(optionsObj)) {
....
} else {
// Invalid xml document.
...
customErrorHandlingUtil eUtilObj =
new customErrorHandlingUtil();
eUtilObj.handleErrorCollection(errorList);
}
}
}
如果XML实例文档无效,则使用帮助类customErrorHandlingUtil调用自定义错误处理。
分享到:
相关推荐
7. **错误处理**:在解析XML或生成XML过程中,可能会遇到各种错误,如格式错误、命名空间问题等。XMLBeans提供了详细的异常处理机制,可以帮助开发者定位问题。 综上所述,XMLBeans是一个强大的工具,它通过将XML ...
XMLBeans的核心理念是将XML Schema转换为Java类,这样就可以直接在Java程序中以对象的形式处理XML数据,无需手动解析XML字符串。这个过程被称为XML Schema绑定(Schema-Based XML Binding)。 在提供的资源中,...
2. **类路径配置**:正确设置类路径,确保所有必要的 JAR 文件都被包含,包括 POI 和 XMLBeans。 3. **处理大型文件**:由于 XMLBeans 的解析方式,处理大型 XML 文件可能需要较大的内存。因此,需要适当调整 JVM 的...
8. **错误处理和调试**:在使用XMLBeans时,理解错误消息和异常处理非常重要。例如,当XML文档不符合Schema约束时,XMLBeans会抛出异常,你需要能够捕获并解析这些异常以进行调试。 综上所述,“xmlbeans demo”...
赠送jar包:xmlbeans-5.0.3.jar; 赠送原API文档:xmlbeans-5.0.3-javadoc.jar; 赠送源代码:xmlbeans-5.0.3-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
2. **构建脚本**:如`build.xml`,这是Ant构建系统文件,用于编译和打包XMLBeans。通过阅读这些脚本,我们可以了解XMLBeans的构建过程和依赖项。 3. **示例**:可能包含`samples`目录,其中包含了一些使用XMLBeans...
在"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处理能力。 为了使用...
JAXB允许Java对象和XML数据之间进行自动转换,简化了在Java应用程序中处理XML的工作。 2. **resolver.jar**:这个文件通常包含XML解析器的依赖,如Apache的Xerces解析器,用于解析XML文档并处理DTD(文档类型定义)...
2. **高性能的XML处理**:XMLBeans利用了静态编译的优势,提供了比DOM和SAX更高的性能。它避免了DOM的内存消耗,同时比SAX更加便捷,因为SAX是事件驱动的,而XMLBeans允许直接访问XML结构。 3. **类型安全的API**:...
XMLBeans是Apache软件基金会开发的一款强大的XML处理工具,它的核心功能是将XML Schema(XSD)转换为Java类,...通过深入学习和熟练掌握XMLBeans,开发者可以提升XML处理能力,更轻松地应对XML在实际项目中的各种挑战。
XMLBeans是Apache软件基金会开发的一款Java库,它允许开发者直接在Java对象和XML文档之间进行交互。这个"xmlbeans-2.6.0"版本包含了...由于其类型安全性和高性能,XMLBeans成为了很多Java开发者处理XML的首选工具之一。
在实际应用中,例如在娱乐业,XMLBeans可以帮助开发客户和供应商应用程序,例如处理内容分发、版权管理、播放列表等,这些都需要跨系统的数据交换和处理。通过使用XMLBeans,开发人员可以快速构建功能丰富的应用,...
总结来说,XMLBeans是Java环境中处理XML的强大工具,尤其适用于需要强类型安全和高性能的应用场景。了解并熟练掌握XMLBeans的使用,能够提升XML数据处理的效率和质量。然而,根据具体项目需求和资源限制,可能需要...
2. **类型安全**:由于XML数据与Java对象之间存在直接的映射关系,因此在处理XML时可以避免因错误的数据类型导致的运行时异常。 3. **性能优化**:XMLBeans通过编译XML Schema到Java字节码,提供了高性能的XML处理...
通过这种方式,XMLBeans提供了一种类型安全的方式来操作XML,减少了处理XML时可能出现的错误。 使用XMLBeans,你可以: - **生成Java类**:根据XML Schema,XMLBeans可以自动生成相应的Java类,这些类可以直接实例...
1. **类型安全**:XMLBeans为XML数据提供了强类型的支持,这意味着在编译时就能检测出潜在的错误,比如试图访问不存在的元素或属性,或者赋值类型不匹配。 2. **性能优化**:XMLBeans利用了Java的反射机制,通过...
5. **类型安全**:由于XMLBeans是基于XML Schema的,所以它能确保在编译时就能发现类型错误,而不是在运行时。 6. **与其他技术集成**:XMLBeans可以轻松地与其他Java库集成,例如Spring框架,以便在企业级应用中...