使用JaxB进行解组时出现问题

时间:2013-07-15 11:58:06

标签: java jaxb annotations

我有以下XML文件要解组

<root>
  <emp>Google</emp>
  <emp>Yahoo</emp>
  <xyz>random</xyz>
</root>

我以下列方式使用了注释,

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

   @XmlElement(name = "emp")
   private String emp1;
   @XmlElement(name = "emp")
   private String emp2;
   @XmlElement(name = "xyz")
   private String xyz;
   // added getters and setters for these fields
}

我的问题是在我想要的时候

   obj.getEmp1(); // result is Yahoo instead of Google
   obj.getEmp2(); // result is null.

请告诉我,我做错了什么?

3 个答案:

答案 0 :(得分:4)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB (JSR-222)专家组的成员。

标准JAXB(JSR-222)注释不支持将2个不同的属性映射到同一XML元素。

您可以在此用例中使用EclipseLink JAXB(MOXy)的@XmlPath扩展名。

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

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

   @XmlPath("emp[1]/text()")
   private String emp1;
   @XmlPath("emp[2]/text()")
   private String emp2;
   @XmlElement(name = "xyz")
   private String xyz;

   // added getters and setters for these fields
}

了解更多信息

答案 1 :(得分:2)

如果由于某种原因您无法使用MOXy,另一种解决方案是将emp元素映射为列表

@XmlRootElement(name = "root")
@XmlAccessorType(XmlAccessType.FIELD)
public class abc {
   @XmlElement(name = "emp")
   private List<String> emp;
   @XmlElement(name = "xyz")
   private String xyz;
   // added getters and setters for these fields
}

然后使用以下代码获取值:

obj.getEmp().get(0);
obj.getEmp().get(1);

Blaise's solution更优雅


您可以拥有String[]字段,并让当前的访问者方法访问String[]

import javax.xml.bind.annotation.*;

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

    private String[] emp = new String[2];
    private String xyz;

    public String getEmp1() {
        return emp[0];
    }

    public void setEmp1(String emp1) {
        this.emp[0] = emp1;
    }

    public String getEmp2() {
        return emp[1];
    }

    public void setEmp2(String emp2) {
        this.emp[1] = emp2;
    }

    public String getXyz() {
        return xyz;
    }

    public void setXyz(String xyz) {
        this.xyz = xyz;
    }

}

答案 2 :(得分:0)

这可能有用。

<root>
  <emp1>Google</emp1>
  <emp2>Yahoo</emp2>
  <xyz>random</xyz>
</root>

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

   @XmlElement(name = "emp1")
   private String emp1;
   @XmlElement(name = "emp2")
   private String emp2;
   @XmlElement(name = "xyz")
   private String xyz;
}