1057.md 4.7 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
# 基本的例子

> 原文: [https://docs.oracle.com/javase/tutorial/jaxb/intro/basic.html](https://docs.oracle.com/javase/tutorial/jaxb/intro/basic.html)

本节介绍基本 JAXB 示例(Modify Marshal,Unmarshal Validate),演示如何:

*   将 XML 文档解组为 Java 内容树并访问其中包含的数据
*   修改 Java 内容树
*   使用 `ObjectFactory` 类创建 Java 内容树,然后将其封送到 XML 数据
*   在解组期间执行验证
*   在运行时验证 Java 内容树

## 修改元帅示例

Modify Marshal 示例演示了如何修改 Java 内容树。

1.  _jaxb-ri-install_ `/samples/modify-marshal/src/Main.java` 类声明导入三个标准 Java 类,五个 JAXB 绑定框架类和`引物.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.*;

    ```

2.  创建 `JAXBContext` 实例用于处理 `primer.po` 中生成的类。

    ```

    JAXBContext jc = JAXBContext.newInstance( "primer.po" );

    ```

3.  创建 `Unmarshaller` 实例,并且 `po.xml` 文件被解组。

    ```
    Unmarshaller u = jc.createUnmarshaller();
    PurchaseOrder po = (PurchaseOrder)
        u.unmarshal(new FileInputStream("po.xml"));

    ```

4.  `set` 方法用于修改内容树的`地址`分支中的信息。

    ```
    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"));

    ```

5.  创建 `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 构建和运行修改 Marshal 示例

要使用 Ant 编译并运行 Modify Marshal 示例,请在终端窗口中转到 _jaxb-ri-install_ `/ samples / modify-marshal /` 目录并键入以下内容:

```
ant

```

## Unmarshal Validate 示例

Unmarshal Validate 示例演示了如何在解组期间启用验证。请注意,JAXB 在解组期间提供验证功能,但在编组期间不提供。验证在[更多关于验证](arch.html#bnazn)中有更详细的解释。

1.  _jaxb-ri-install_ `/samples/unmarshal-validate/src/Main.java` 类声明一个标准 Java 类,11 个 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.*;

    ```

2.  创建 `JAXBContext` 实例用于处理 `primer.po` 包中生成的类。

    ```
    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"));

    ```

W
wizardforcel 已提交
141
6.  默认验证事件处理器处理验证错误,生成 `system.out` 的输出,然后抛出异常。
W
init  
wizardforcel 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161

    ```
    } catch( UnmarshalException ue ) {
        System.out.println("Caught UnmarshalException");
    } catch( JAXBException je ) { 
        je.printStackTrace();
    } catch( IOException ioe ) {
        ioe.printStackTrace();
    }

    ```

### 使用 Ant 构建和运行 Unmarshal 验证示例

要使用 Ant 编译和运行 Unmarshal Validate 示例,请在终端窗口中转到 _jaxb-ri-install_ `/ samples / unmarshal-validate /` 目录并键入以下内容:

```
ant 

```