java - 针对 xsd 生成 xml 时,JAXB 创建无效的 nillable 元素

标签 java jaxb marshalling

在我的 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

    }

我觉得这个还是可以的。

所以现在当我创建具有空值且仅具有属性的元素时

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

JAXB 创建无效的 xml:

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

(缺少 nillable=true)

谁能帮我解决这个问题。

PS: 我知道在 xsd 中我允许 minOccurs=0然后插件生成包含JAXBElement<MyDateElement>的java类我可以在哪里手动设置 nillable 。但我想避免这个解决方案,因为这个元素是必需的

PS:从 XSD 生成 java 类可能存在错误,因为我发现了这个旧错误:https://java.net/jira/si/jira.issueviews:issue-html/JAXB-840/JAXB-840.html 。但这应该得到解决,所以我仍然很困惑

最佳答案

您可以使用 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" />

关于java - 针对 xsd 生成 xml 时,JAXB 创建无效的 nillable 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28537873/

相关文章:

java - 为什么将 @Repository 放在 Spring Data JPA 接口(interface)之上?

java - 这是ButtonGroup的影响吗?

java - 如何编码使用 JAXB(或 XStream)更新 XML 文件而不写入整个文件

database - aerospike-go 库中的嵌入式结构意外行为

c# - 在不装箱的情况下将字节数组复制到通用类型

c# - 如何将自定义结构对象从 C++ COM 组件返回并使用到 C# 应用程序中

java - 如何将预先存在的 Java 项目导入 Eclipse 并启动和运行?

java - 使用 lib JShortcut 在 java 中创建快捷方式

java - 字符串到文件(JAXB 验证)

java - 解码时 Jaxb 和对象类不从 Xml 中获取值