gpt4 book ai didi

java - 如何使用 JAXB 解码重复的嵌套类?

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:10 25 4
gpt4 key购买 nike

我如何指示 JAXB 处理这个?

XML

<root>
<parent>
<child id="1" name="foo" />
</parent>
<parent>
<child id="3" name="foo2" />
</parent>
<parent>
<child id="4" name="bar2" />
</parent>
<parent>
<child id="2" name="bar" />
</parent>
</root>

根.java

@XmlRootElement
public class Root {
@XmlElement(name="parent/child")
List<Child> allChildren;
}

这行不通...... allChildren 是空的。

最佳答案

您可以更改模型并执行以下操作:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElement(name="parent")
List<Parent> allParents;
}

父级

@XmlAccessorType(XmlAccessType.FIELD)
public class Parent {
@XmlElement(name="child")
List<Child> allChildren;
}

更新

Is it possible to avoid the parent class ?

有几种不同的方法可以实现这一点:

选项 #1 - 使用 XmlAdapter 的任何 JAXB 实现

您可以使用 XmlAdapter 虚拟地添加到 Parent 类中。

子适配器

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class ChildAdapter extends XmlAdapter<ChildAdapter.Parent, Child> {

public static class Parent {
public Child child;
}

@Override
public Parent marshal(Child v) throws Exception {
Parent parent = new Parent();
parent.child = v;
return parent;
}

@Override
public Child unmarshal(Parent v) throws Exception {
return v.child;
}

}

@XmlJavaTypeAdapter 注释用于引用 XmlAdapter

import java.util.List;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

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

@XmlElement(name="parent")
@XmlJavaTypeAdapter(ChildAdapter.class)
List<Child> allChildren;

}

child

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Child {

@XmlAttribute
int id;

@XmlAttribute
String name;

}

选项 #2 - 使用 EclipseLink JAXB (MOXy)

如果您使用 EclipseLink JAXB (MOXy)作为你的JAXB (JSR-222)然后你可以执行以下操作(注意:我是 MOXy 的负责人):

import java.util.List;
import javax.xml.bind.annotation.*;

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

@XmlElement(name="parent")
List<Child> allChildren;

}

child

MOXy 的 @XmlPath 注释的工作方式与您尝试在帖子中使用 @XmlElement 注释的方式非常相似。

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlAccessorType(XmlAccessType.FIELD)
public class Child {

@XmlPath("child/@id")
int id;

@XmlPath("child/@name")
String name;

}

了解更多信息

关于java - 如何使用 JAXB 解码重复的嵌套类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13975632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com