1

有人试图用递归引用来编组 JAXB 对象吗?我有以下课程:

public class A {

   private Long id;
   private String name;
   private List<A> aList;

}

我想将其编组为:

<a>
  <a>
    <a>...</a>
  ...
  </a>
...
</a>

我正在使用 maven 插件从 XSD 自动生成 JAXB 类。有什么建议么?

4

2 回答 2

1

您可以执行以下操作:

一种

您可以@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>
于 2013-01-14T11:17:35.347 回答
1

以下是如何从 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>
于 2013-01-15T11:29:36.663 回答