JAXB创建无效的nillable元素时产生对XSD XML(JAXB create invalid

2019-10-21 21:37发布

在我的XSD我有元素

<xs:element name="MyDateElement" type="MyDateElementType" nillable="true" />

<xs:complexType name="MyDateElementType">
    <xs:simpleContent>
        <xs:extension base="xs:date">
            <xs:attribute name="state" type="xs:string" />
            <xs:attribute name="dateFrom" type="xs:date" />
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

我在用

<artifactId>cxf-codegen-plugin</artifactId>

从WSDL生成Java类。

所以这个插件生成该Java类:

public class ParrentClass
    implements Serializable
{

    @XmlElement(name = "MyDateElement", required = true, nillable = true)
    protected MyDateElementType MyDateElement;

// setter and getter

}

public class MyDateElement
    implements Serializable
{

    @XmlValue
    protected Date value;
    @XmlAttribute(name = "state")
    protected String state;
    @XmlAttribute(name = "dateFrom")
    protected Date dateFrom;

    // setter and getter

    }

我认为这仍然是OK。

所以现在,当我用空值,只是用属性创建元素

protected MyDateElement getDatumStav(String state) {
    MyDateElement element = new MyDateElement();
    element.setState(state);
    return element;
}

JAXB创建XML无效:

<ns:MyDateElement stav="S"></ns:MyDateElement>

(的nillable =真缺失)

因此,谁能帮助我,我应该怎么解决这个问题。

PS:我知道,当在我的xsd允许minOccurs=0然后插件生成其中包含Java类JAXBElement<MyDateElement>其中I可以手动设置nillable 。 但我想避免这种情况的解决方案,因为需要这个元素

PS:有可能是错误的,从XSD生成的Java类,因为我发现这个旧的错误: https://java.net/jira/si/jira.issueviews:issue-html/JAXB-840/JAXB-840.html 。 但是,这应该是固定的,所以我仍然感到困惑

Answer 1:

您可以用JDOM2 java类添加:

举个例子 :

Namespace ns0 = Namespace.getNamespace("ns0", "http://...");
Namespace xsi = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
SAXBuilder jdomBuilder = new SAXBuilder();
InputStream stream = new ByteArrayInputStream(xmlFileString.getBytes("UTF-8"));
Document jdomDocument = jdomBuilder.build(stream);

Element root = jdomDocument.getRootElement();
Element agreement = root.getChild("Agreement", ns0);

Element co = agreement.getChild("CoOwner", ns0);
if (co.getText().equals(""))
{
    co.setAttribute("nil", "true", xsi);
}

// Return to string
return new XMLOutputter().outputString(jdomDocument);

输出:

<ns0:CoOwner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />


文章来源: JAXB create invalid nillable element when generate xml against xsd