# 基本的例子

> 原文： [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"));

    ```

6.  默认验证事件处理程序处理验证错误，生成 `system.out` 的输出，然后抛出异常。

    ```
    } 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 

```