JAXB - marshall(大写,小写,命名空间,ns2)

时间:2018-02-14 13:56:27

标签: java jaxb jaxb2

我有大约100个(如果不是更多)通过xjc从大型XSD文件生成的Java类。

该XSD文件的元素具有大写名称。 现在......当我从这些生成的Java类中编组一个对象时,我遇到了一些问题。

JAXB marshall生成的示例XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<advertiser xmlns:ns2="http://p.t.com/service">
    <ns2:Name>TEST Adv 001</ns2:Name>
</advertiser>

1)JAXB以小写形式生成元素的名称(但不是子元素的名称)。我需要它们是大写的(因为它们在XSD中)。

2)元素名称有一些奇怪的ns2:前缀,例如 我想在这个例子中xmlns:ns2只是xmlns,而ns2:Name只是名字。 关于SO的一个答案建议在XSD中放置attributeFormDefault =“unqualified”,但似乎对我没有帮助。

我如何解决这两个问题?

我在这里寻找类似的问题,但没有找到与我完全相同的问题 那里的答案看起来很复杂,他们要求改变我不能做的Java类。为什么要这么复杂?!

请注意,我的Java类是自动生成的,
所以我不想手动更改它们。

我想知道为什么XSD会说一件事,JAXB编组过程会产生另一件事。

JAXB marshall不应该生成100%与XSD兼容的XML吗?

请帮忙。

编辑:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Advertiser", propOrder = {

})
public class Advertiser {

    @XmlElement(name = "TelID")
    protected Integer telID;

    @XmlElement(name = "Name")
    protected String name;

    @XmlElementRef(name = "Address", namespace = "http://p.t.com/service", type = JAXBElement.class)
    protected JAXBElement<String> address;

.............

编辑:

    Advertiser adv = new Advertiser();
    adv.setName("TEST Adv 001");

    StringWriter sw = new StringWriter();
    JAXB.marshal(adv, sw);
    System.out.println(sw.toString());

1 个答案:

答案 0 :(得分:0)

1)奇怪。由于您已经从XSD生成了类,因此它们应该有足够的注释,如果XSD中的元素是大写的,您应该使用大写元素名称获取@XmlElement注释。发布几个模式派生类,有趣的是它们的样子。你是对的,当你从XSD生成类时,你应该在编组时得到符合XSD的XML(或多或少)。至少元素的情况应该匹配。这很奇怪,我无法解释。发布课程,我们会看到。

2)见

  

Is it possible to customize the namespace prefix that JAXB uses when marshalling to a String?

更新

好的,现在我看到问题所在。您封送了Advertiser的实例,但它只是@XmlType而不是@XmlRootElement。因此,JAXB不知道它应该在哪个根元素进行编组,并且默认情况下会在空命名空间中生成advertiser,小写。

要解决此问题,您可以添加@XmlRootElement注释或将Advertiser实例包装到JAXBElement

对于后者,检查与ObjectFactory类相同的包中的Advertiser类。你可以这样做(类似):

ObjectFactory objectFactory = new ObjectFactory();
JAXBElement<Advertiser> advElement = objectFactory.createAdvertiser(adv);

编组advElement应该为您提供正确的元素名称。

在编译XML Schema时,XJC为每个全局元素生成此类createXYZ(XYZ value)方法。