Тег списка JAXB создание внутреннего класса
Итак, у нас есть тип XSD в виде:
<xs:complexType name="Foo">
<xs:all>
<xs:element name="Bars">
<xs:complexType>
<xs:sequence>
<xs:element name="Bar" type="barType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
для представления XML-код:
<Foo>
<!-- Elements snipped for brevity-->
<Bars>
<Bar>
<!-- Bar Element -->
</Bar>
</Bars>
</Foo>
xjc дает почти правильные результаты. Единственное, что раздражает, это то, что" бары " создаются как внутренний класс, который хранит список баров. Есть ли в любом случае, чтобы бары были списком в Foo, сохраняя при этом XML выше?
5 ответов
другим способом было бы удалить окружающий элемент
когда вы определяете бары как сложный тип, бары будут генерироваться как отдельный класс. Как это я нахожу schema также легче читать. Бары не будут перечислены в Foo, если вы не измените maxOccurs на значение выше 1 - Вы не можете сделать это на xs:all, но вы можете использовать XS:sequence.
...
<xs:complexType name="Foo">
<xs:all>
<xs:element name="Bars" type="Bars" />
</xs:all>
</xs:complexType>
<xs:complexType name="Bars">
<xs:sequence>
<xs:element name="Bar" type="barType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
...
после запуска 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;
}
}
бары.java:
...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Bars", propOrder = {
"bar"
})
public class Bars {
@XmlElement(name = "Bar", required = true)
protected List<String> bar;
...
}
С xs: seqence, чтобы получить список баров (maxOccurs= " unbounded"): Имя xsd:
...
<xs:complexType name="Foo">
<xs:sequence>
<xs:element name="Bars" type="Bars" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Bars">
<xs:sequence>
<xs:element name="Bar" type="barType" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
...
Фу.java:
...
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foo", propOrder = {
"bars"
})
public class Foo {
@XmlElement(name = "Bars", required = true)
protected List<Bars> bars;
public List<Bars> getBars() {
if (bars == null) {
bars = new ArrayList<Bars>();
}
return this.bars;
}
}
плагин Бьярне Хансена для xjc (https://github.com/dmak/jaxb-xew-plugin) позволит вам остаться с" барами", заключающими элемент, генерируя удобную аннотацию @XmlElementWrapper(name="Bars").
возможно, ниже образца помогает.
XML Schema
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="test">
<xs:sequence>
<xs:element name="dataList" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="str" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Java-класс :
public class Test {
protected List<String> dataList;
protected String str;
public List<String> getDataList() {
if (dataList == null) {
dataList = new ArrayList<String>();
}
return this.dataList;
}
public String getStr() {
return str;
}
public void setStr(String value) {
this.str = value;
}
}
EDIT 1:
вы можете перепроектировать с java-кода на xsd. в JAVA_HOME / bin есть исполняемый файл schemagen.
дайте свой код java, и он создаст схему XSD для вас, используя ваш класс java.
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> bar;
public List<Bar> getBar() {
return bar;
}
@XmlElementWrapper(name="Bars")
@XmlElement(name="Bar")
public void setBar(List<Bar> 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);
}
}