JAXB - Calling marshal

Posted huey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAXB - Calling marshal相关的知识,希望对你有一定的参考价值。

Only a handful of source code lines is required to make a JAXB Marshaller object write a document tree as an XML file. First you obtain a Marshaller from a JAXBContext. Then, you might set a number of properties, such as the one that\'s used below, which requests nice formatting of the XML text. Other properties concern the inclusion of a schema location as an attribute in the top-level element, or the encoding in the XML prolog. The first argument must be an object that is either a root element, as defined by your schema, or a JAXBElement<?>.

import java.io.*;
import javax.xml.bind.*

void writeDocument( Object document, String pathname )
    throws JAXBException, IOException {
    Class<T> clazz = document.getValue().getClass();
    JAXBContext context = JAXBContext.newInstance( clazz.getPackage().getName() );
    Marshaller m = context.createMarshaller();
    m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
    m.marshal( document, new FileOutputStream( pathname ) );
}

Sometimes marshalling needs to be done not only for one or two root documents but for objects of many different schema types. You could, of course, add xsd:element definitions for all of them to the top level xsd:schema element, but this is cumbersome. A generic solution is presented below. The method wraps an arbitrary element of some type T into a JAXBElement<T>.

<T> JAXBElement<T> wrap( String ns, String tag, T o ){
    QName qtag = new QName( ns, tag );
    Class<?> clazz = o.getClass();
    @SuppressWarnings( "unchecked" )
    JAXBElement<T> jbe = new JAXBElement( qtag, clazz, o );
    return jbe;
}

To use it, you must create a context capable of handling all the classes that might crop up as instantiations for T. (Creating a JAXBContext for several packages or classes is explained in section The JAXB Context.) With a Marshaller m obtained from this context, the application of wrap is as simple as this:

SomeType st = ...;
JAXBElement<SomeType> jbx = wrap( "http://www.acme.com", "someTag", st );
m.marshal( jbx, System.out );

 

以上是关于JAXB - Calling marshal的主要内容,如果未能解决你的问题,请参考以下文章

如何获取JAXB对象的命名空间

在 Spring MVC 控制器中注入 Jaxb2Marshaller

使用JAXB在XML元素中使用marshall属性

对于jaxb-impl 2.2.11,com.sun.xml.bind.marshaller软件包中没有名为CharacterEscapeHandler的类存在

如何在一个Jaxb2Marshaller中处理更多的WSDL?

Jaxb2Marshaller在春天解组 - 意想不到的元素