3

我有以下 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.

请澄清我,我做错了什么?

4

3 回答 3

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
}

了解更多信息

于 2013-07-15T12:05:44.167 回答
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 的解决方案更优雅


您可以有一个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;
    }

}
于 2013-07-15T12:42:02.917 回答
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;
}
于 2013-07-15T12:05:25.827 回答