[英]Generate valid XML from classes generated with XSD
我正在嘗試生成一個 XML,該 XML 通過編組 object 創建的類來驗證給定的 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;
}
}
使用jaxb2 jaxb2-maven-plugin
生成的 Bar.java
@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 object 實例創建
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);
預期 output
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo>
<Bar/>
</Foo>
實際 output
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo/>
問題是由於Foo
object 的bar
字段是null
,盡管它是required = true
。
所以,這是我的問題:如何使用尊重required
字段的構造函數生成 Java 類? 我本以為這是生成的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 與您的數據在 class 結構中的方式完全相同。 XSD 說什么並不重要。 您的 class Foo 中沒有 Bar 的實例,因此您不會讓孩子進入最終結果。
您需要的是一些東西,它會按照 XSD 將其描述為有效的方式自動用樣本數據填充您的數據結構。 為此,您可以編寫一個庫或使用一個庫(不幸的是,我什么都不知道)。 您可以使用已生成的 JAXB 注釋。
您也可以直接從 XSD 創建 XML,而無需將所有內容轉換為 Java 對象。 我想您可以使用我剛剛在互聯網上找到的這個庫: https://santhosh-tekuri.github.io/jlibs/xsd/XSInstance.ZFC35FDC70D5FC69D269EZ883A8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.