首页 > 解决方案 > JAXB 解组多个同名节点

问题描述

如果 XML 如下所示,则尝试解组 XML 并获得相同的结果:

<resultsData>
   <passed>
     <testScript id="1" name="t1"/>
     <testScript id="2" name="t2"/>
   </passed>
   <passed>
     <testScript id="3" name="t3"/>
   </passed>
 </resultsData>

或者

<resultsData>
   <passed>
     <testScript id="1" name="t1"/>
     <testScript id="2" name="t2"/>
     <testScript id="3" name="t3"/>
   </passed>
 </resultsData>

目前,当我解组第一个 xml 时,其中一个传递的节点被遗漏了。如果所有 testScript 节点都放在一个通过的标记中,它会按预期工作。

目前有两个班

@XmlRootElement(name = "testScript") // watch case and if class of same name exists
// @XmlAccessorType(XmlAccessType.NONE)
public class AgentTestScript implements Serializable {
  private static final long serialVersionUID = -6777979502036334475L;
//  @XmlAttribute
  private Integer id;
  
//  @XmlAttribute
  private String name;
  
  public AgentTestScript() {} // required to be a legal bean
  public AgentTestScript(Integer id, String name) {
    this.id = id;
    this.name = name;
  }

  @XmlAttribute
  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

//  @XmlElement
  @XmlAttribute
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
  @Override
  public String toString() {
    return "AgentTestScript [id=" + id + ", name=" + name + "]";
  }
}

@XmlRootElement(name = "resultsData")
//@XmlAccessorType(XmlAccessType.FIELD)
public class AgentResultsData implements Serializable{
  private static final long serialVersionUID = 6871291894594957636L;
  
  private List<AgentTestScript> failed = new ArrayList<>();   
  
//  @XmlElement(nillable = true, required = true)
  private List<AgentTestScript> passed = new ArrayList<>();

  private Integer numberOfScripts;
  
  public AgentResultsData() {} // required to be a bean
  
  @XmlElement(name = "testScript")
  @XmlElementWrapper
  public List<AgentTestScript> getFailed() {
    return failed;
  }
  
  public void setFailed(List<AgentTestScript> failed) {
    this.failed = failed;
  }

  @XmlElement(name = "testScript")
  @XmlElementWrapper
  public List<AgentTestScript> getPassed() {
    System.out.println("h2");
//    return null;
    return passed;
  }

  public void setPassed(List<AgentTestScript> passed) {
    System.out.println("h1");
    this.passed = passed;
  }

//  @XmlElement(required = true, nillable = true)
  public Integer getNumberOfScripts() {
    return numberOfScripts;
  }

  public void setNumberOfScripts(Integer numberOfScripts) {
    this.numberOfScripts = numberOfScripts;
  }
}

我的问题是如何让两个提供的 XML 产生相同的结果?似乎这应该是可能的。

标签: xmljaxb

解决方案


推荐阅读