基本示例应用

本节提到的五个基本示例应用说明了如何:

·   将一个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. getdisplay方法用来解析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.outsetPropertyAPI用来指定输出编码,在这里是格式化(人可以识别)的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对象中。

po.setItems( items ); 

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发送确认警告和错误消息。在遇到第一个确认错误后,默认的配置就会中止反编组操作。

u.setValidating( true ); 

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类为五个基本的