在课堂上使用XSD选择字段进行编组

时间:2014-05-21 09:50:16

标签: java xml jaxb xsd marshalling

我使用Java类动态生成WSDL架构。我把它作为我的一个领域:

@XmlElements({
    @XmlElement(name = "A", type = String.class),
    @XmlElement(name = "B", type = Integer.class),
    @XmlElement(name = "C", type = String.class),
    @XmlElement(name = "D", type = String.class)
})
protected Object aOrBOrCOrD;

在编组期间,当设置单选属性aOrBOrCOrD时,将在XML中设置哪个标记名称(A,B,C或D)?

因为只有一个字段包含数据。而String也可能意味着3个选择元素中的任何一个。怎么解决这个问题?

我可以在4中拆分单个字段,并在以某种方式生成WSDL时仍保持choice属性吗?

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

Java模型

<强>富

您可以使用@XmlElementsObject类型的属性,而不是@XmlElementRefsJAXBElement类型的属性。 JAXBElement允许您保留元素名称。

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    @XmlElementRefs({
        @XmlElementRef(name = "A", type = JAXBElement.class),
        @XmlElementRef(name = "B", type = JAXBElement.class),
        @XmlElementRef(name = "C", type = JAXBElement.class),
        @XmlElementRef(name = "D", type = JAXBElement.class)
    })
    protected JAXBElement<?> aOrBOrCOrD;

}

<强>的ObjectFactory

@XmlElementRef一起,您需要在使用@XmlElementDec注释的类上添加相应的@XmlRegistry注释。

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name="A")
    public JAXBElement<String> createA(String value) {
        return new JAXBElement<String>(new QName("A"), String.class, value);
    }

    @XmlElementDecl(name="B")
    public JAXBElement<Integer> createB(Integer value) {
        return new JAXBElement<Integer>(new QName("B"), Integer.class, value);
    }

    @XmlElementDecl(name="C")
    public JAXBElement<String> createC(String value) {
        return new JAXBElement<String>(new QName("C"), String.class, value);
    }

    @XmlElementDecl(name="D")
    public JAXBElement<String> createD(String value) {
        return new JAXBElement<String>(new QName("D"), String.class, value);
    }

}

演示代码

<强>演示

import java.io.StringReader;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foo.class, ObjectFactory.class);

        StringReader xml = new StringReader("<foo><C>Hello World</C></foo>");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Foo foo = (Foo) unmarshaller.unmarshal(xml);

        JAXBElement<?> aOrBOrCOrD = foo.aOrBOrCOrD;
        System.out.println(aOrBOrCOrD.getName().getLocalPart());
        System.out.println(aOrBOrCOrD.getDeclaredType());
        System.out.println(aOrBOrCOrD.getValue());
    }

}

<强>输出

C
class java.lang.String
Hello World