使用JAXB解析XML中具有相同名称的多个元素

3

我正在尝试解组一个具有多个相同名称元素的XML文档。 我不确定是否需要创建我的bean的ArrayList并将其传递给unmarshaller。 我希望有人能给我一些指针来解决这个问题。 我正在尝试解析的XML作为SOAP响应,但我剥离了信封,所以我只有它的主体部分,看起来像这样:

<return>
    <row>
        <fkdevice>bddc228e-4774-18b3-9c64-e218cbef7a8x</fkdevice>
    </row>
    <row>
        <fkdevice>74a5a260-bbd9-0491-7c58-0b1983180d2c</fkdevice>
    </row>
    <row>
        <fkdevice>312b5326-d7f1-4fb6-b1d9-dd96bb016152</fkdevice>
    </row>
    <row>
        <fkdevice>ed110481-e1e1-4659-ae09-1d23d888292b</fkdevice>
    </row>
</return>

这是从一个包含50个以上字段的表返回的数据,但是我创建了一个testBean,并且仅定义了fkdevice字段,以使它变得简单。我的bean如下:

package beans;
//imports    

@XmlRootElement(name="return")
public class testBean {
   //I think I need an arraylist here because I have multiple elements with teh same name.
   public ArrayList<string> fkdevice;

   public ArrayList<String> getFkdevice(){
       return fkdevice;
   }

   public void setFkdevice(ArrayList<String> fkdevice){
       this.fkdevice = fkdevice;
   }
}

这个错误提示我:存在1个IllegalAnnotationExceptions计数,表示该类拥有两个同名属性“fkdevice”,并且它指向getter和setter方法。
任何信息都可能有帮助, 提前致谢。
2个回答

7
也许是这样的:

可能像这样:

@XmlRootElement(name="return")
public class returnBean {
   private ArrayList<Row> rows;

   public ArrayList<Row> getRows(){
       return rows;
   }

   public void setRows(ArrayList<Row> rows){
       this.rows = rows;
   }
}

注意现在该字段是私有的。

然后您可能不需要在这里添加注释:

public class Row {
    private String fkdevice;

    public String getFkdevice() {
        return fkdevice;
    }

    public void setFkdevice(String val) {
        fkdevice = val;
    }
}

如果我有一个类似于fkdevice的“名称”或其他字段,这个方法可以工作,但我无法访问它们。因此,如果我打印x.getRow().get(0),这将打印[row:null]。当我调试时,我可以看到行具有子项fkdevice作为第一个子项和名称作为下一个兄弟项,但我无法弄清如何访问它们? - laitha0
<name> 在 XML 中的哪个位置?与 <row> 内的 <fkdevice> 处于同一层级吗? - Lee Meador
我已经为数据库中的每个字段添加了getter和setter,但返回的是一个行(Rows)的ArrayList。我无法访问“行”下面的内容。 - laitha0
x.getRows().get(0).getFkdevice()x.getRows().get(0).getName() 等等。 - Lee Meador
DeviceNumPlanMap只是一个普通的POJO,类似于你上面写的Row类,除了它是根据我所指的表命名的,并且有大约30个字段。 - laitha0
显示剩余10条评论

2

您的字段和方法都是公共的。默认情况下,JAXB会绑定每个公共字段和每个getter/setter对。

一种解决方案是使用@XmlAccessorType来指定只有字段绑定到XML。

@XmlRootElement(name="return")
@XmlAccessorType( XmlAccessType.FIELD )
public class testBean {

    @XmlElement( name="fkdevice" )
    public ArrayList<string> fkdevice;
    ...
}

我通常会在每个字段上添加@XmlElement 或 @XmlTransient 的注释。已经添加了上述注解。 - Andy Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接