2

我在使用 jaxb2-maven-plugin(1.5) 解组 XML 时遇到问题。基本上我在我的 XML 文档中有一个类型 B 的元素 A,它是一个基本域类 Class A。类型 B 是一个扩展 A 的域类。现在,我可以看到带有 xsi 的元素 A 的 XML :type="B"。但是当我解组它时,它仍然返回一个 A 类型的 Java 对象。我该如何解决这个问题?我需要能够获得 B 类型的对象。只要 XML 具有符号 xsi:type,它应该能够解组它,正确。还是我还需要 XMLAdapters 等?

非常感谢。

4

1 回答 1

2

有几件事需要检查:

  • JAXBContext知道B类吗?您可以包含在用于创建JAXBContext或添加类@XmlSeeAlso({B.class})A类中。
  • 类型的名称是否与类B对应B?默认情况下它将是b. 您可以使用@XmlType注释来指定名称。

一个

package forum13712986;

import javax.xml.bind.annotation.XmlSeeAlso;

@XmlSeeAlso({B.class})
public class A {

}

package forum13712986;

import javax.xml.bind.annotation.XmlType;

@XmlType(name="B") // Default name is "b"
public class B extends A {

}

演示

package forum13712986;

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        String xml = "<A xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='B'/>";
        StreamSource source = new StreamSource(new StringReader(xml));
        JAXBElement<A> jaxbElement = unmarshaller.unmarshal(source, A.class);

        System.out.println(jaxbElement.getValue().getClass());
    }

}

输出

class forum13712986.B
于 2012-12-04T22:35:47.833 回答