Basic Examples
本节描述了基本的 JAXB 示例(修改 marshal,取消 marshal 验证),它们演示了如何:
-
将 XML 文档解组到 Java 内容树中并访问其中包含的数据
-
修改 Java 内容树
-
使用
ObjectFactory
类创建 Java 内容树,然后将其编组为 XML 数据 -
解组期间执行验证
-
在运行时验证 Java 内容树
修改 marshal 示例
Modify Marshal 示例演示了如何修改 Java 内容树。
- jaxb-ri-install
/samples/modify\-marshal/src/Main\.java
类声明导入三个标准 Java 类,五个 JAXB 绑定框架类和primer\.po
包:
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import primer.po.*;
- 创建了一个
JAXBContext
实例来处理primer\.po
中生成的类。
JAXBContext jc = JAXBContext.newInstance( "primer.po" );
- 创建一个
Unmarshaller
实例,并解组po\.xml
文件。
Unmarshaller u = jc.createUnmarshaller();
PurchaseOrder po = (PurchaseOrder)
u.unmarshal(new FileInputStream("po.xml"));
set
方法用于修改内容树的address
分支中的信息。
USAddress address = po.getBillTo();
address.setName("John Bob");
address.setStreet("242 Main Street");
address.setCity("Beverly Hills");
address.setState("CA");
address.setZip(new BigDecimal
address.setName("John Bob");
address.setStreet("242 Main Street");
address.setCity("Beverly Hills");
address.setState("CA");
address.setZip(new BigDecimal("90210"));
- 创建一个
Marshaller
实例,并将更新的 XML 内容编组到system\.out
。setProperty
API 用于指定输出编码;在这种情况下,它是格式化的(人类可读的)XML。
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(po, System.out);
使用 Ant 构建并运行 Modify Marshal 示例
要使用 Ant 编译并运行 Modify Marshal 示例,请在终端窗口中,转到 jaxb-ri-install /samples/modify\-marshal/
目录,然后键入以下内容:
ant
解组验证示例
“解组验证”示例演示了如何在解组期间启用验证。请注意,JAXB 提供了用于在编组期间进行验证的功能,但不在编组期间进行验证。验证在有关验证的更多信息中有更详细的说明。
- jaxb-ri-install
/samples/unmarshal\-validate/src/Main\.java
类声明一个标准 Java 类,十一个 JAXB 绑定框架类和primer\.po
包的导入:
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.UnmarshalException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.ValidationEventLocator;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Schema;
import primer.po.*;
- 创建了一个
JAXBContext
实例来处理在primer\.po
包中生成的类。
JAXBContext jc = JAXBContext.newInstance("primer.po");
Unmarshaller
实例已创建。
Unmarshaller u = jc.createUnmarshaller();
- 默认的 JAXB
Unmarshaller
ValidationEventHandler
已启用,可以向system\.out
发送验证警告和错误。默认配置会导致遇到第一个验证错误时解组操作失败。
u.setValidating( true );
- 试图将
po\.xml
文件解组到 Java 内容树中。就本示例而言,po\.xml
文件包含故意的错误。
PurchaseOrder po = (PurchaseOrder)u.unmarshal(
new FileInputStream("po.xml"));
- 默认的验证事件处理程序处理验证错误,将输出生成到
system\.out
,然后引发异常。
} catch( UnmarshalException ue ) {
System.out.println("Caught UnmarshalException");
} catch( JAXBException je ) {
je.printStackTrace();
} catch( IOException ioe ) {
ioe.printStackTrace();
}
使用 Ant 构建和运行解组验证示例
要使用 Ant 编译并运行 Unmarshal Validate 示例,请在终端窗口中,转到 jaxb-ri-install /samples/unmarshal\-validate/
目录并键入以下内容:
ant