JAXB List Tag创建内部类

所以我们在表单中有一个XSD类型:

           

表示XML:

         

xjc产生几乎正确的结果。 唯一令人讨厌的事情是“Bars”被创建为一个内部类,它存储一个Bars列表。 反正有没有条形码在Foo中仍然是一个列表,同时仍然保留上面的XML?

另一种方法是删除周围的元素,XML看起来不再那么好了,但它会使java代码更容易阅读。 与xjc的简单绑定(请参阅http://jaxb.java.net/nonav/jaxb20-fcs/docs/vendorCustomizations.html )一起,它将生成相当漂亮且有用的java代码。

将Bars定义为复杂类型时,Bars将生成为分隔的类。 像这样我发现架构也更容易阅读。 除非你将maxOccurs更改为大于1的值,否则Bars不会是Foo中的List – 你不能在xs:all上执行此操作,但你可以使用xs:sequence。

 ...           ... 

运行xjc后:Foo.java:

  ... @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Foo", propOrder = { }) public class Foo { @XmlElement(name = "Bars", required = true) protected Bars bars; public Bars getBars() { return bars; } public void setBars(Bars value) { this.bars = value; } } 

Bars.java:

  ... @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Bars", propOrder = { "bar" }) public class Bars { @XmlElement(name = "Bar", required = true) protected List bar; ... } 

使用xs:seqence获取Bars列表(maxOccurs =“unbounded”):XSD:

  ...           ... 

Foo.java:

 ... @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Foo", propOrder = { "bars" }) public class Foo { @XmlElement(name = "Bars", required = true) protected List bars; public List getBars() { if (bars == null) { bars = new ArrayList(); } return this.bars; } } 

Bjarne Hansen的xjc插件( https://github.com/dmak/jaxb-xew-plugin )允许你使用“Bars”封闭元素,生成方便的@XmlElementWrapper(name =“Bars”)注释。

也许以下示例有帮助。

XML Schema

           

Java类:

 public class Test { protected List dataList; protected String str; public List getDataList() { if (dataList == null) { dataList = new ArrayList(); } return this.dataList; } public String getStr() { return str; } public void setStr(String value) { this.str = value; } } 

编辑1:

您可以从java代码到xsd进行反向工程。 在JAVA_HOME / bin中有schemagen可执行文件。

提供您的Java代码,它将使用您的java类为您创建XSD架构。

看到这个链接

 schemagen myObj1.java myObj2.java 

您可以执行以下操作:

 package example; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name="Foo") public class Foo { private List bar; public List getBar() { return bar; } @XmlElementWrapper(name="Bars") @XmlElement(name="Bar") public void setBar(List bar) { this.bar = bar; } } 

 package example; public class Bar { } 

然后,您可以使用以下代码处理XML;

 package example; import java.io.File; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; public class Demo { public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Foo.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); Foo foo = (Foo) unmarshaller.unmarshal(new File("src/forum128/input.xml")); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(foo, System.out); } }