微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从用 XSD 生成的类生成有效的 XML

如何解决从用 XSD 生成的类生成有效的 XML

目标

我正在尝试生成一个 XML,该 XML 通过编组使用所述 XSD 生成的类创建的对象来针对给定 XSD 进行验证。

请注意,我无法修改 XSD,也不想编辑生成的类。

示例

foo.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema>
    <xs:element name="Foo" type="Foo"/>
    <xs:complexType name="Foo">
        <xs:sequence>
            <xs:element name="Bar" type="Bar"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Bar">
        <xs:sequence>
            <xs:element maxOccurs="1" minOccurs="0" name="Baz" type="Max6Text"/>
        </xs:sequence>
    </xs:complexType>
    <xs:simpleType name="Max6Text">
        <xs:restriction base="xs:string">
            <xs:minLength value="1"/>
            <xs:maxLength value="6"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

Foo.java 使用 jaxb2-maven-plugin

生成
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "Foo",propOrder = {
    "bar"
})
public class Foo {

    @XmlElement(name = "Bar",required = true)
    protected Bar bar;

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar value) {
        this.bar = value;
    }
}

Bar.java 使用 jaxb2-maven-plugin

生成
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "Bar",propOrder = {
    "baz"
})
public class Bar {

    @XmlElement(name = "Baz")
    protected String baz;

    public String getBaz() {
        return baz;
    }

    public void setBaz(String value) {
        this.baz = value;
    }
}

Foo 对象实例创建

Foo foo = new ObjectFactory().createFoo();

编组

File xmlResult = File.createTempFile("foo",".xml");

JAXBContext jaxbContext = JAXBContext.newInstance(Foo.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
marshaller.marshal(new ObjectFactory().createFoo(foo),new FileOutputStream(xmlResult));

String result = Files.readString(Path.of(xmlResult.getPath()));
System.out.println(result);

问题

预期输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo>
    <Bar/>
</Foo>

实际输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo/>

问题是由于 bar 对象的 Foo 字段是 null,尽管它是 required = true

所以,这是我的问题:如何使用尊重 required 字段的构造函数生成 Java 类?我希望这是一个生成Foo.java

@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "Foo",required = true)
    protected Bar bar;

    public Foo() {
        this.bar = new ObjectFactory().createBar();
    }

    public Bar getBar() {
        return bar;
    }

    public void setBar(Bar value) {
        this.bar = value;
    }
}

我没有在 jaxb2-maven-plugin 中找到任何配置来更改此设置。

解决方法

这里有一些事情需要澄清。我认为您的问题可能是您的数据正在按照您的数据在类结构中的方式转换为 XML。 XSD 说什么并不重要。您的 Foo 类中没有 Bar 的实例,因此您不会让孩子进入最终结果。

您需要的是一些东西,它会按照 XSD 将其描述为有效的方式自动用示例数据填充您的数据结构。为此,您可以编写一个库或使用一个库(不幸的是我不知道任何一个)。您可以使用已生成的 JAXB 注释。

您还可以直接从 XSD 创建 XML,而无需将所有内容都转换为 Java 对象。我想你可以使用我刚刚在互联网上找到的这个库:https://santhosh-tekuri.github.io/jlibs/xsd/XSInstance.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。