gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:28:52 26 4
gpt4 key购买 nike

目标
我正在尝试生成一个 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 类 field ?我原以为这是一个生成的 Foo.java :
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foo", propOrder = {
"bar"
})
public class Foo {

@XmlElement(name = "Bar", 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 的实例,因此您不会让 child 进入最终结果。
你需要的是一些东西,它自动用示例数据填充你的数据结构,就像 XSD 将它描述为有效的那样。为此,您可以编写一个库或使用一个库(不幸的是我不知道任何一个)。您可以使用已生成的 JAXB 注释。
您还可以直接从 XSD 创建 XML,而无需将所有内容都转换为 Java 对象。我想你可以使用我刚刚在互联网上找到的这个库:https://santhosh-tekuri.github.io/jlibs/xsd/XSInstance.html

关于java - 从用 XSD 生成的类生成有效的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66369768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com