基本示例应用
本节提到的五个基本示例应用说明了如何:
·
将一个XML文档反编组到一个Java内容树中并访问其中的内容
·
修改一个Java内容树
·
利用ObjectFactory类来从头创建一个Java内容树并将其编组成XML数据
·
在反编组期间进行确认
·
运行时对Java内容树进行确认
示例应用1
示例应用1主要用来演示如何将一个XML文档反编组到一个Java内容树中并访问其中的内容。
1. <JWSDP_HOME>/jaxb-1.0/examples/users-guide/SampleApp1/Main.java类为四个标准的Java类、三个JAXB绑定框架类以及primer.po包声明了import。
import java.io.FileInputStream
import java.io.IOException
import java.util.Iterator
import java.util.List
import javax.xml.bind.JAXBContext
import javax.xml.bind.JAXBException
import javax.xml.bind.Unmarshaller
import primer.po.*;
2. JAXBContext实例是为处理primer.po中生成的类而创建的。
JAXBContext jc = JAXBContext.newInstance( "primer.po" );
3.一个Unmarshaller实例被创建。
Unmarshaller u = jc.createUnmarshaller();
4. po.xml被反编组到一个Java内容树中,该内容树中包含了由JAXB绑定编译器生成到primer.po包中的对象。
PurchaseOrder po =
(PurchaseOrder)u.unmarshal(
new FileInputStream( "po.xml" ) );
5. 一个简单字符串被打印到system.out,以便为采购单发票提供一个标题。
System.out.println( "Ship the following items to: " );
6. get和display方法用来解析XML内容以便为输出作准备。
USAddress address = po.getShipTo();
displayAddress( address );
Items items = po.getItems();
displayItems( items );
7. 实现了基本的错误处理。
} catch( JAXBException je ) {
je.printStackTrace();
} catch( IOException ioe ) {
ioe.printStackTrace();
8. Java树中的USAddress分支被遍历,地址信息被打印到system.out。
public static void displayAddress( USAddress address ) {
// display the address
System.out.println( "\t" + address.getName() );
System.out.println( "\t" + address.getStreet() );
System.out.println( "\t" + address.getCity() +
", " + address.getState() +
" " + address.getZip() );
System.out.println( "\t" + address.getCountry() +
"\n");
}
9. Items列表分支被遍历,条目信息被打印到system.out。
public static void displayItems( Items items ) {
// the items object contains a List of
//primer.po.ItemType objects
List itemTypeList = items.getItem();
10. 重复Items分支的遍历过程,直到所有的条目都被打印。
for( Iterator iter = itemTypeList.iterator(); iter.hasNext(); )
{
Items.ItemType item = (Items.ItemType)iter.next();
System.out.println( "\t" + item.getQuantity() +
" copies of \"" + item.getProductName() +
"\"" );
}
示例输出
运行该示例应用的java Main会产生下面的输出:
Ship the following items to:
Alice Smith
123 Maple Street
Cambridge, MA 12345
US
5 copies of "Nosferatu - Special Edition (1929)"
3 copies of "The Mummy (1959)"
3 copies of "Godzilla and Mothra: Battle for Earth/Godzilla
vs. King Ghidora"
示例应用2
示例应用2用来说明如何修改一个Java内容树。
1. <JWSDP_HOME>/jaxb-1.0/examples/users-guide/SampleApp2/Main.java类为三个标准的Java类、四个JAXB绑定框架类以及primer.po包声明了import。
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import primer.po.*;
2. JAXBContext实例是为处理primer.po中生成的类而创建的。
JAXBContext jc = JAXBContext.newInstance( "primer.po" );
3. 一个Unmareshaller实例被创建,且po.xml被反编组。
Unmarshaller u = jc.createUnmarshaller();
PurchaseOrder po =
(PurchaseOrder)u.unmarshal(
new FileInputStream( "po.xml" ) );
4. 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( "90210" ) );
5. 一个Marshaller实例被创建并且更新过的XML内容被编组成system.out。setPropertyAPI用来指定输出编码,在这里是格式化(人可以识别)的XML格式。
Marshaller m = jc.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE
);
m.marshal( po, System.out );
示例输出
运行该示例应用的java Main会产生下面的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purchaseOrder orderDate="1999-10-20-05:00">
<shipTo country="US">
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</shipTo>
<billTo country="US">
<name>John Bob</name>
<street>242 Main Street</street>
<city>Beverly Hills</city>
<state>CA</state>
<zip>90210</zip>
</billTo>
<items>
<item partNum="242-NO">
<productName>Nosferatu - Special Edition (1929)</productName>
<quantity>5</quantity>
<USPrice>19.99</USPrice>
</item>
<item partNum="242-MU">
<productName>The Mummy (1959)</productName>
<quantity>3</quantity>
<USPrice>19.98</USPrice>
</item>
<item partNum="242-GZ">
<productName>Godzilla and Mothra: Battle for Earth/Godzilla vs.
King Ghidora</productName>
<quantity>3</quantity>
<USPrice>27.95</USPrice>
</item>
</items>
</purchaseOrder>
示例应用3
示例应用3主要用来说明如何利用ObjectFactory类从头创建一个Java内容树,并将其编组成XML数据。
1. <JWSDP_HOME>/jaxb-1.0/examples/users-guide/SampleApp3/Main.java类为四个标准Java类、三个JAXB绑定框架类以及primer.po包声明了import:
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import primer.po.*;
2. JAXBContext实例是为处理在primer.po中生成的类而创建的。
JAXBContext jc = JAXBContext.newInstance( "primer.po" );
3. ObjectFactory类用来实例化一个新的空PurchaseOrder对象。
// creating the ObjectFactory
ObjectFactory objFactory = new ObjectFactory();
// create an empty PurchaseOrder
PurchaseOrder po = objFactory.createPurchaseOrder();
4. 按照po.xsd模式中的约束条件,PurchaseOrder对象需要一个orderDate属性值。为了满足该约束条件,orderDate被设置成使用java.util.Calendar中的标准Calendar.getInstance()方法。
po.setOrderDate( Calendar.getInstance() );
5. ObjectFactory用来实例化新的空USAddress对象,并且所需的属性也被设置。
USAddress shipTo = createUSAddress( "Alice Smith",
"123 Maple Street",
"Cambridge",
"MA",
"12345" );
po.setShipTo( shipTo );
USAddress billTo = createUSAddress( "Robert Smith",
"8 Oak Avenue",
"Cambridge",
"MA",
"12345" );
po.setBillTo( billTo );
6. ObjectFactory类用来实例化一个新的空Items对象。
Items items = objFactory.createItems();
7. get方法用来得到ItemType链表的一个引用。
List itemList = items.getItem();
8. ItemType对象被创建并添加到Items链表中。
itemList.add( createItemType(
"Nosferatu - Special Edition (1929)",
new BigInteger( "5" ),
new BigDecimal( "19.99" ),
null,
null,
"242-NO" ) );
itemList.add( createItemType( "The Mummy (1959)",
new BigInteger( "3" ),
new BigDecimal( "19.98" ),
null,
null,
"242-MU" ) );
itemList.add( createItemType(
"Godzilla and Mothra: Battle for Earth/Godzilla vs. King
Ghidora",
new BigInteger( "3" ),
new BigDecimal( "27.95" ),
null,
null,
"242-GZ" ) );
9. 这时items对象中就包含了一个ItemType对象的链表,并可以被添加到po对象中。
10. 一个Marshaller实例被创建,并且更新过的XML内容被编组到system.out中。SetPropertyAPI用来指定输出代码,这里是格式化的(人可以识别)XML格式。
Marshaller m = jc.createMarshaller();
m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE );
m.marshal( po, System.out );
11. 一个空的USAddress对象被创建,并且它的属性被设置的与模式约束条件一致。
public static USAddress createUSAddress(
ObjectFactory objFactory,
String name, String street,
String city,
String state,
String zip )
throws JAXBException {
// create an empty USAddress objects
USAddress address = objFactory.createUSAddress();
// set properties on it
address.setName( name );
address.setStreet( street );
address.setCity( city );
address.setState( state );
address.setZip( new BigDecimal( zip ) );
// return it
return address;
}
12. 和前面的步骤类似,一个空的ItemType对象被创建,并且它的属性也被设置的与模式约束一致。
public static Items.ItemType createItemType( ObjectFactory
objFactory,
String productName,
BigInteger quantity,
BigDecimal price,
String comment,
Calendar shipDate,
String partNum )
throws JAXBException {
// create an empty ItemType object
Items.ItemType itemType =
objFactory.createItemsItemType();
// set properties on it
itemType.setProductName( productName );
itemType.setQuantity( quantity );
itemType.setUSPrice( price );
itemType.setComment( comment );
itemType.setShipDate( shipDate );
itemType.setPartNum( partNum );
// return it
return itemType;
}
示例输出
运行该示例应用的java Main会生成如下输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<purchaseOrder orderDate="2002-09-24-05:00">
<shipTo>
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</shipTo>
<billTo>
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
<city>Cambridge</city>
<state>MA</state>
<zip>12345</zip>
</billTo>
<items>
<item partNum="242-NO">
<productName>Nosferatu - Special Edition (1929)</productName>
<quantity>5</quantity
<USPrice>19.99</USPrice>
</item>
<item partNum="242-MU">
<productName>The Mummy (1959)</productName>
<quantity>3</quantity>
<USPrice>19.98</USPrice>
</item>
<item partNum="242-GZ">
<productName>Godzilla and Mothra: Battle for Earth/Godzilla vs.
King Ghidora</productName>
<quantity>3</quantity>
<USPrice>27.95</USPrice>
</item>
</items>
</purchaseOrder>
示例应用4
示例应用4用来说明如何在反编组过程中启用确认(反编组-时间确认)。注意JAXB只为反编组过程提供确认功能,而不为编组过程提供。关于确认的更多信息,请参见关于确认的更多信息。
1. <JWSDP_HOME>/jaxb-1.0/examples/users-guide/SampleApp4/Main.java类为三个标准的Java类、七个JAXB绑定框架类以及primer.po包声明了import:
import java.io.FileInputStream;
import java.io.IOException;
import java.math.BigDecimal;
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.util.ValidationEventCollector;
import primer.po.*;
2. 为处理primer.po中生成的类而创建一个JAXBContext实例。
JAXBContext jc = JAXBContext.newInstance( "primer.po" );
3. 创建一个Unmarshaller实例。
Unmarshaller u = jc.createUnmarshaller();
4. 默认的JAXB Unmarshaller ValidationEventHandler用来向system.out发送确认警告和错误消息。在遇到第一个确认错误后,默认的配置就会中止反编组操作。
5. 试着将po.xml反编组到一个Java内容树中。在本例中,处于某种需要po.xml中有意包含了一个错误。
PurchaseOrder po =
(PurchaseOrder)u.unmarshal( new FileInputStream( "po.xml"
) );
6. 默认的确认事件句柄处理确认错误,向system.out生成输出,然后抛出一个异常。
} catch( UnmarshalException ue ) {
System.out.println( "Caught UnmarshalException" );
} catch( JAXBException je ) {
je.printStackTrace();
} catch( IOException ioe ) {
ioe.printStackTrace();
示例输出
运行该示例应用的java Main会生成下面的输出:
DefaultValidationEventHandler: [ERROR]: "-1" does not satisfy
the "positiveInteger" type
Caught UnmarshalException
示例应用5
示例应用5主要用来说明如何在运行时确认一个Java内容树。不论在什么时候,客户端应用都可以调用Java内容树(或者它的任一子树)上的Validator.validate方法。所有的JAXB提供商都需要支持这项操作。关于确认的详细解释请参见关于确认的更多信息。
1. <JWSDP_HOME>/jaxb-1.0/examples/users-guide/SampleApp5/Main.java类为五个基本的 |