当前位置: 首页 > 面试题库 >

JAXB2:将嵌套元素映射到同一Java类中

爱琪
2023-03-14
问题内容

我在尝试将嵌套元素映射到同一Java类时遇到麻烦。

XML格式

我在这里想要做的是将id属性和text元素设置为SlideText类。

<module name="test project">
    <slide id="1">
        <layout>
            <text>hello</text>
        </layout>
    </slide>
</module>

模块类别

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Module {
    @XmlAttribute
    private String  name;

    @XmlElements({
        @XmlElement(name = "slide", type = SlideText.class)
    })
    private Slide   slide;
}

滑梯类

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class Slide {
    @XmlAttribute
    private String  id;
}

SlideText类

我尝试@XmlElementWrappertext属性上使用,但是遇到了@XmlElementWrapper只能应用于集合的异常。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SlideText extends Slide {

    // how to map this to layout/text elements?
    private String  text;
}

有没有办法映射<layout><text>hello</text></layout>SlideTexttext属性?

谢谢。

更新

为了说明我要在此处完成的工作,根据使用的布局,幻灯片可以是任何类型。A
module知道它是一个,slide但不知道它是什么幻灯片,这就是为什么我有抽象Slide类。

本质上,如果这行得通,我将进行创建SlideImageSlideTextVideo进行扩展Slide

实际的XML文件如下所示:

<module name="test project">
    <slide id="1">
        <layout-text>
            <text>hello</text>
        </layout-text>
    </slide>
</module>
<module name="test project">
    <slide id="2">
        <layout-image>
            <image-path>img.jpg</image-path>
        </layout-image>
    </slide>
</module>
<module name="test project">
    <slide id="3">
        <layout-text-video>
            <text>hello</text>
            <video-path>a.mp4</video-path>
        </layout-text-video>
    </slide>
</module>

问题答案:

如果您使用EclipseLink
JAXB(MOXy),
则可以利用@XmlPath扩展名(我是MOXy技术负责人):

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class SlideText extends Slide {

    @XmlPath("layout/text/text()")
    private String  text;

}
  • http://bdoughan.blogspot.com/2010/09/xpath-based-mapping-geocode-example.html

使用标准的JAXB,您可以利用XmlAdapter:

  • http://bdoughan.blogspot.com/2010/07/xmladapter-jaxbs-secret-weapon.html


 类似资料:
  • 有人能帮忙填写上面的评论部分吗?或者是否有其他选项来映射这些对象? 编辑:我尝试了下面的解决方案,但是接口实现类本身发生了变化。

  • 我有基类orderItem并且有子类DeviceItem和ServiceItem。我提供了下面的定义。当我收到这个请求时,我执行dozer映射以将jaxb模型转换为我创建的另一个数据模型。我的数据模型也有相同的OrderItem、DerviceItem和DeviceItem类,它们是POJO。当我进行dozer映射时,类会映射到OrderItem(基类)而不是专门的子类。有没有办法执行此用户doz

  • 我有两个嵌套的case类: 当然,解决方案应该是泛型的,并且适用于任何case类。 注意:这个讨论很好地回答了如何将单个case类映射到映射。但我无法将其用于嵌套的case类。相反,我得到了:

  • 我不知道如何在Java类中处理嵌套的JSON值。为了尽可能简单,我创建了四个Java类,每个类都有“嵌套级别”。然而,我试图在一个Java类中包含所有这些值。我该怎么做? Json: Java类:

  • 有没有什么方法可以将嵌套的JSON值映射到字段而不需要额外的类?我有一个JSON响应 但是在中,我只需要值。因此,我决定创建Kotlin数据类,并尝试使用注释的选项 下面的代码正在工作 我有几个嵌套值,为它们创建额外的类是相当夸张的。还有比为节点创建嵌套类更好的方法吗?

  • 我有一个restendpoint,它返回3级嵌套json,如下所示: 我有一个java类,没有相同的3个嵌套级别: 当我使用restTemplate拨打rest电话时: jackson甚至没有使用json ignore属性映射字段departName(因为我猜它不在同一嵌套级别)。 如何将这个http json响应映射到忽略嵌套父json的java字段?