当前位置: 首页 > 知识库问答 >
问题:

JAXB用java泛型解组

平元明
2023-03-14

我正在尝试使用JAXB从遗留系统中解压XML文档。我的xml结构如下所示:

<response>
    <id>000000</id>
    <results>
        <result>
<!-- Request specific xml content -->
            <year>2003</year>
            <title>Lorem Ipsum</title>
            <items>
                <item>I1</item>
                <item>I2</item>
            </items>
        </result>
        <result>
            <year>2007</year>
            <title>Dolor sit amet</title>
            <items>
                <item>K1</item>
                <item>K2</item>
            </items>
        </result>
    </results>
</response>

// imports here
@XmlRootElement(name="response")
@XmlAccessorType(XmlAccessType.FIELD)
public class XResponse<T>{
    private String id;

    @XmlElementWrapper(name="results")
    @XmlElement(name="result")
    private List<T> results;

// setters and getters
}

...

@XmlRootElement(name="result")
@XmlAccessorType(XmlAccessType.FIELD)
public class X1Result{
    private String year;
    private String title;
    @XmlElementWrapper(name="items")
    @XmlElement(name="item")
    private List<String> items;

// setters and getters
}
...

我尝试通过以下代码对xml文档进行解组:

JAXBContext context = JAXBContext.newInstance(XResponse.class, X1Result.class);
Unmarshaller um = context.createUnmarshaller();
XResponse<X1Result> response = (XResponse<X1Result>) um.unmarshal( xmlContent );

List<X1Result> results = unmarshal.getResults();
for (X1Result object : results) {
    System.out.println(object.getClass());
}

我在解组过程中遇到一个问题,它无法将列表项强制转换到X1Result类中。相反,它使用org。阿帕奇。薛西斯。多姆。ElementNSImpl

我应该怎么做才能使JAXB解组器使用X1Resultclass?

提前感谢


共有1个答案

蒲寂离
2023-03-14

我认为应该使用继承而不是泛型。给定这样的XML:

<?xml version="1.0" encoding="UTF-8"?>
<response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <id>000000</id>
    <results>
        <result xsi:type="X1Result">
            <year>2003</year>
            <title>Lorem Ipsum</title>
            <items>
                <item>I1</item>
                <item>I2</item>
            </items>
        </result>
        <result xsi:type="X1Result">
            <year>2007</year>
            <title>Dolor sit amet</title>
            <items>
                <item>K1</item>
                <item>K2</item>
            </items>
        </result>
    </results>
</response>

您可以动态绑定

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "XResult")
@XmlSeeAlso({
    X1Result.class
})public abstract class XResult {

}

您有实现类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "X1Result")
public class X1Result extends XResult {
    @XmlElement(name = "year")
    private String year;

    @XmlElement(name = "title")
    private String title;

    @XmlElementWrapper(name = "items")
    @XmlElement(name = "item")
    private List<String> items;
    ...
}

在XResponse类中使用顶级类型:

@XmlRootElement(name = "response")
@XmlAccessorType(XmlAccessType.FIELD)
public class XResponse {
    @XmlElement(name = "id")
    private String id;

    @XmlElementWrapper(name = "results")
    @XmlElement(name = "result")
    private List<XResult> results;
    ...
}

您可以使用顶级类型进行解组:

context = JAXBContext.newInstance(XResponse.class, XResult.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
XResponse response = (XResponse) unmarshaller.unmarshal(new File("testfile.xml"));

List<XResult> results = response.getResults();
for (XResult object : results) {
    System.out.println(object.getClass());
}

 类似资料:
  • 我对JAXB很陌生,在解封一般对象时遇到了麻烦。问题是我需要能够封送和解封任何对象(java.lang.object)。我成功地进行了封送处理,但是当我运行解封处理时,响应中得到的是一个“ElementNSimpl”对象,而不是我自己的对象。 这是涉及的bean: message.java somebean.java jaxb.index的内容: 生成的xml很好()但是在解封后计算“msg.ge

  • 问题内容: 我正在尝试使用JAXB的自省功能来编组和分解所有使用JAXB批注标记的现有域对象。大多数事情都按预期运行,但是要获得一个相当简单的类进行序列化,我会遇到很多麻烦。此类在许多bean上用作@XmlElement,看起来像: 我尝试执行以下操作,但没有成功,JAXB仍然对接口Comparable感到愤怒。 将Range和DoubleRange都用作bean getter的返回类型会产生如下

  • 本文向大家介绍Java泛型详解,包括了Java泛型详解的使用技巧和注意事项,需要的朋友参考一下 1. Why ——引入泛型机制的原因     假如我们想要实现一个String数组,并且要求它可以动态改变大小,这时我们都会想到用ArrayList来聚合String对象。然而,过了一阵,我们想要实现一个大小可以改变的Date对象数组,这时我们当然希望能够重用之前写过的那个针对String对象的Arra

  • 这可能是一个愚蠢的问题,所以请原谅我的无知。 如果我用: 编译器说foo.execute(val)是一个错误。带有一条沿着setWrapped方法(bar )行的消息,类型为foo 不适用于参数(bar )。 如果我想把福变成

  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 问题内容: 我试图了解类泛型的工作原理,这对我来说毫无意义。 因此,例如,如果我有以下课程: 然后我尝试 go方法不应该接受A或A的任何子类吗? 谢谢 :) 问题答案: 这样做的原因是基于Java如何实现泛型的。 数组示例 使用数组可以做到这一点(数组是协变的,正如其他人解释的那样) 但是,如果您尝试这样做会发生什么? 最后一行可以正常编译,但是如果您运行此代码,则可能会得到一个。因为您正在尝试将