JAXB:将Javabean Object转换为XML所有属性作为XML属性而不是XML元素(节点)

时间:2012-02-09 05:11:25

标签: java xml jaxb

目前我正致力于将对象转换为XML,我注意到所有对象属性都列为XML元素(节点),除非您在特定的getter或设置上使用@XmlAttribute

只是想知道有没有办法在JAXB中自动将所有对象属性转换为XML属性。

示例代码:

JAXBContext jc = JAXBContext.newInstance( foo.class );
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.setProperty(Marshaller.JAXB_FRAGMENT, true);
Foo foo = new foo();
foo.setType("type");
foo.setValue("value");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
m.marshal(foo, baos);

3 个答案:

答案 0 :(得分:1)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

目前没有办法配置默认情况下,简单属性应映射到XML属性。已为MOXy提交以下增强请求以添加此行为。

  • Bug 333604 - 增强功能:为默认的简单属性提供元数据(而不是元素)

答案 1 :(得分:0)

您是否尝试在类顶级使用@XmlRootElement?

答案 2 :(得分:0)

如果您将JAXB用于复杂模式,那么在XSD中定义结构是个好主意:

<xsd:schema targetNamespace="http://myUri"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="parent">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="child" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:long"/>
        <xsd:attribute name="name" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>
<xsd:element name="child">
    <xsd:complexType>
        <xsd:attribute name="id" type="xsd:long"/>
        <xsd:attribute name="name" type="xsd:string"/>
        <xsd:attribute name="code" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>

这可以使用jaxb-xjc.java文件进行编译,并且您将定义的xsd:attributes作为Java中的属性。