我有大约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());
答案 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)
方法。