JAXB使用包名生成XML元素

时间:2015-10-17 16:13:32

标签: xml jaxb

我正在尝试使用JAXB从POJO生成一个简单的XML。这是我的XML输出:

<Customer>
    <name>abcd</name>
</Customer>
对于这个POJO:

@XmlRootElement
private static class Customer {
    @Max(5)
    private String name;
    public String getName() {
        return name;
    }
    @XmlElement
    public void setName(String name) {
        this.name = name;
    }
}

我希望XML根元素完全描述,即使用整个包名。所以XML输出应该是:

<com.some.pkg.Customer>
    <name>abcd1231</name>
</com.some.pkg.Customer>

这是我的Java代码:

Customer s = new Customer();
    s.setName("abcd");

    JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    StringWriter sw = new StringWriter();
    jaxbMarshaller.marshal(s, sw);
    System.out.println(sw.toString());

这是否适用于JAXB?我必须设置哪种属性来获得那种输出?

1 个答案:

答案 0 :(得分:1)

<com.some.pkg.Customer>
    <name>abcd1231</name>
</com.some.pkg.Customer>

这是无效的XML:元素名称不能包含点或空格或其他标点符号......但允许使用-。因此,无法使用JAXB或其他方式生成此特定XML(因为它不是XML)。

相反,JAXB要做的是在package-info文件上使用注释,该文件自定义如何处理元素的命名空间(名称空间前缀,生成完全限定的名称等)。

这样你最终会得到类似的东西:

<ns:Customer xmlns:ns="com.some.pkg">
  <ns:name>abcd1231</ns:name>
</ns:Customer>

com.some.pkg

的package-info.java文件示例
@XmlSchema(namespace = "com.some.pkg", 
           xmlns = { @XmlNs(namespaceURI = "com.some.pkg", prefix = "ns") },
           attributeFormDefault = XmlNsForm.QUALIFIED, 
           elementFormDefault = XmlNsForm.QUALIFIED)
package com.some.pkg;

import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;