java - Jaxb不会捕获所有子节点

标签 java jaxb

我有一个如下所示的 xml 文档

<root>
<subElement>
    <a>an instance</a>
    <b>another instance</b>
    <problemElement>
      <option>1st instance</option>
      <option>2nd instance</option>
      <option>3rd instance</option>
    </problemElement>

</subElement>

<subElement>
    <a></a>
    <b></b>
    <problemElement>
      <option>instance</option>
    </problemElement>

</subElement>
</root>

我的 jaxb 类看起来像这样;

@XmlRootElement(name = "root")
@XmlType(name = "Root")
public class Root{

  @XmlElement(name = "subElement", required = true)
  private final List<SubElement> subElementList = new ArrayList<SubElement>();

  public List<SubElement> getSubElementList() {
    return subElementList;
  }
}



@XmlType(name = "SubElement", propOrder = {"a", "b", "problemElement"})
public abstract class SubElement{

  @XmlElement(required = true)
  private String a;

  @XmlElement(required = true)
  private String b;

  @XmlElement(name = "problemElement", required = true)
  private List<ProblemElement> problemElement= new ArrayList<ProblemElement>();

  public String getA() {
    return a;
  }

  public String getB() {
    return b;
  }

  public List<ProblemElement> getProblemElement() {
    return problemElement;
  }
}



@XmlType(name = "ProblemElement" )
public class ProblemElement {

  @XmlElement(required = true)
  private String option;


  public String getOption() {
    return option;
  }
}

除了问题元素之外,一切正常。该列表仅返回 xml 中的最后一个选项节点值,在本例中为“第三个实例”。我究竟做错了什么?

最佳答案

简答

对于您的用例,我将利用 problemElement 属性上的 @XmlElementWrapper 注释:

@XmlElementWrapper(name="problemElement")
@XmlElement(name="option")
private List<ProblemElement> problemElement = new ArrayList<ProblemElement>();

我将在 option 属性上使用 @XmlValue 属性:

  @XmlValue
  private String option;

长答案

下面是一个完全映射的示例。

package forum10531285;

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

@XmlRootElement(name = "root")
@XmlType(name = "Root")
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    @XmlElement(name = "subElement", required = true)
    private final List<SubElement> subElementList = new ArrayList<SubElement>();

}

子元素

package forum10531285;

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

@XmlType(name = "SubElement", propOrder = { "a", "b", "problemElement" })
@XmlAccessorType(XmlAccessType.FIELD)
public class SubElement {

    @XmlElement(required = true)
    private String a;

    @XmlElement(required = true)
    private String b;

    @XmlElementWrapper(name="problemElement")
    @XmlElement(name="option")
    private List<ProblemElement> problemElement = new ArrayList<ProblemElement>();

}

问题元素

package forum10531285;

import javax.xml.bind.annotation.*;

@XmlType(name = "ProblemElement" )
@XmlAccessorType(XmlAccessType.FIELD)
public class ProblemElement {

  @XmlValue
  private String option;

}

演示

package forum10531285;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum10531285/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

输入.xml/输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <subElement>
        <a>an instance</a>
        <b>another instance</b>
        <problemElement>
            <option>1st instance</option>
            <option>2nd instance</option>
            <option>3rd instance</option>
        </problemElement>
    </subElement>
    <subElement>
        <a></a>
        <b></b>
        <problemElement>
            <option>instance</option>
        </problemElement>
    </subElement>
</root>

关于java - Jaxb不会捕获所有子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10531285/

相关文章:

java - 如何访问另一个 xml 元素中的 xml 元素(JAXB 绑定(bind)

java - 解码具有多个同名元素的 XML JAXB

java - 在 Java 中使用正态逼近的泊松分布

java - EJB 事务和 JAX-RS

java - 尝试查询数据库时,与其他两个实体相关的 Hibernate 实体会导致 NPE

java - 嵌套集的 JPA Criteria 查询

Java:混合(数据类型)变量参数

java - Wsdl2Java CXF - 生成 JAXBElement 列表而不是字段

java - 如何为 IntelliJ IDEA 中的所有项目设置默认项目位置?

java - Spring 4.0 与 Java JDK 版本 7 的兼容性