有人试图用递归引用来编组 JAXB 对象吗?我有以下课程:
public class A {
private Long id;
private String name;
private List<A> aList;
}
我想将其编组为:
<a>
<a>
<a>...</a>
...
</a>
...
</a>
我正在使用 maven 插件从 XSD 自动生成 JAXB 类。有什么建议么?
有人试图用递归引用来编组 JAXB 对象吗?我有以下课程:
public class A {
private Long id;
private String name;
private List<A> aList;
}
我想将其编组为:
<a>
<a>
<a>...</a>
...
</a>
...
</a>
我正在使用 maven 插件从 XSD 自动生成 JAXB 类。有什么建议么?
您可以执行以下操作:
一种
您可以@XmlElementRef
在字段上使用注释,aList
以便它使用的元素来自类@XmlRootElement
上的注释A
。
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
private Long id;
private String name;
@XmlElementRef
private List<A> aList;
}
演示
下面是一些示例代码,以证明一切正常。
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(A.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14306965/input.xml");
A a = (A) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(a, System.out);
}
}
输入.xml/输出
下面是运行演示代码的输入和输出。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
<id>1</id>
<name>A</name>
<a>
<id>2</id>
<name>B</name>
<a>
<id>3</id>
<name>C</name>
</a>
</a>
</a>
XML 模式
下面是与此模型对应的 XML 模式。您可以从中生成模型或从 Java 模型开始。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a" type="a"/>
<xs:complexType name="a">
<xs:sequence>
<xs:element name="id" type="xs:long" minOccurs="0"/>
<xs:element name="name" type="xs:string" minOccurs="0"/>
<xs:element ref="a" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
以下是如何从 XML 模式开始支持此用例。
XML 架构 (schema.xsd)
以下 XML 架构基于您对上一个答案 (http://stackoverflow.com/a/14317461/383861) 所做的评论。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns:tns="http://www.example.org"
elementFormDefault="qualified">
<xs:element name="b">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:a" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:long" />
<xs:sequence>
<xs:element ref="tns:a" minOccurs="0" maxOccurs="10" />
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
生成模型
以下代码是使用该xjc
工具生成的。get/set 方法和注释已被删除以节省空间。
一种
package org.example;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"id",
"a"
})
@XmlRootElement(name = "a")
public class A {
protected long id;
protected List<A> a;
}
乙
package org.example;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"a"
})
@XmlRootElement(name = "b")
public class B {
@XmlElement(required = true)
protected List<A> a;
}
包信息
@javax.xml.bind.annotation.XmlSchema(
namespace = "http://www.example.org",
elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.example;
对象工厂
package org.example;
import javax.xml.bind.annotation.XmlRegistry;
@XmlRegistry
public class ObjectFactory {
public ObjectFactory() {
}
public B createB() {
return new B();
}
public A createA() {
return new A();
}
}
演示代码
import java.io.File;
import javax.xml.bind.*;
import org.example.A;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance("org.example");
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14306965/input.xml");
A a = (A) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(a, System.out);
}
}
输入(输入.xml)/输出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a xmlns="http://www.example.org">
<id>1</id>
<a>
<id>2</id>
<a>
<id>3</id>
</a>
</a>
</a>