2011-11-17 171 views
1

我有以下tester.xml文件,其中包含有关事件的一些信息。解组在JAXB

<?xml version="1.0"?> 

<resultset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<row> 
    <field name="esid">539661</field> 
    <field name="esname">Title 01</field> 
    <field name="eslink">http://www.some_event_link.com</field> 
    <field name="estext">Event description 01</field> 
    <field name="esinfo" xsi:nil="true" /> 
    <field name="espicture_small">http://www.some_event_link.com/media/small_image.jpg</field> 
    <field name="espicture">http://www.some_event_link.com/media/some_image..gif</field> 
    <field name="espicture_big">http://www.some_event_link.com/media/big_image.jpg</field> 
    <field name="esbegin">2000-11-22</field> 
    <field name="esend">2011-12-15</field> 
    <field name="eventid">1379305</field> 
    <field name="eventname">Event name 01</field> 
    <field name="eventdate">2011-10-12</field> 
    <field name="eventtime">19:00:00</field> 
    <field name="eventlink">http://www.mysite.com/tickets.html</field> 
    <field name="eventvenue">Event venue 01</field> 
</row> 
<row> 
    <field name="esid">539636</field> 
    <field name="esname">Title 02</field> 
    <field name="eslink">http://www.some_event_link.com</field> 
    <field name="estext">Event description 02</field> 
    <field name="esinfo" xsi:nil="true" /> 
    <field name="espicture_small">http://www.some_event_link.com/media/small_image.jpg</field> 
    <field name="espicture">http://www.some_event_link.com/media/some_image..gif</field> 
    <field name="espicture_big">http://www.some_event_link.com/media/big_image.jpg</field> 
    <field name="esbegin">2000-10-10</field> 
    <field name="esend">2011-11-01</field> 
    <field name="eventid">1379081</field> 
    <field name="eventname">Event name 01</field> 
    <field name="eventdate">2011-10-12</field> 
    <field name="eventtime">14:00:00</field> 
    <field name="eventlink">http://www.mysite.com/tickets.html</field> 
    <field name="eventvenue">Event venue 02</field> 
</row> 

我也有我的XML映射类如下。
第一个是对应于该标记的类<结果集>

package com.wapice.xml.beans; 

import java.util.ArrayList; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 


@XmlRootElement(name = "resultset") 
public class Resultset { 

    private ArrayList<Row> rowsList; 


    @XmlElement(required = true, name = "row") 
    public ArrayList<Row> getRowsList() { 
    return rowsList; 
    } 


    public void setRowsList(ArrayList<Row> rowsList) { 
    this.rowsList = rowsList; 
    } 

} 

接着是对应于所述标签<行>

package com.wapice.xml.beans; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 


@XmlRootElement(name = "row") 
@XmlType(propOrder = {"field"}) 
public class Row { 

    private String field; 


    @XmlElement(required = true, name = "field") 
    public String getField() { 
     return field; 
    } 


    public void setField(String field) { 
     this.field = field; 
    } 

} 

我试图解组此xml到类对象&使用以下代码片段在我的控制台上打印字段名称&值。

try { 
    JAXBContext context = JAXBContext.newInstance(Resultset.class); 
    Unmarshaller unmarshaller = context.createUnmarshaller(); 
    Resultset resultSet = (Resultset)unmarshaller.unmarshal(new FileReader("tester.xml")); 

    for(Row row : resultSet.getRowsList()){ 
    System.out.println("Field : " +row.getField()); 
    } 
} 
catch (JAXBException e) { 
    e.printStackTrace(); 
} 
catch (IOException e) { 
    e.printStackTrace(); 
} 

但是当我运行上面的代码,它只能打印最后一个字段的值。输出如下。

Field : Event venue 01 
Field : Event venue 02 

是否有人可以告诉我,我在做什么错在这里&这将不胜感激,如果有人能告诉我如何打印我的所有<场>他们的名字&值一起。

在此先感谢。
Asela。

回答

1

我设法解决我的问题与你的讯息&这是真的真的很有帮助。非常感谢你。不过,我必须做一些修改才能使它工作,因为我的映射类抛出了以下异常。

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 
Class has two properties of the same name "rowsList" 
this problem is related to the following location: 
    at public java.util.ArrayList com.wapice.xml.beans.Resultset.getRowsList() 
    at com.wapice.xml.beans.Resultset 
this problem is related to the following location: 
    at private java.util.ArrayList com.wapice.xml.beans.Resultset.rowsList 
    at com.wapice.xml.beans.Resultset 
Class has two properties of the same name "fieldsList" 
this problem is related to the following location: 
    at public java.util.ArrayList com.wapice.xml.beans.Row.getFieldsList() 
    at com.wapice.xml.beans.Row 
    at private java.util.ArrayList com.wapice.xml.beans.Resultset.rowsList 
    at com.wapice.xml.beans.Resultset 
this problem is related to the following location: 
    at private java.util.ArrayList com.wapice.xml.beans.Row.fieldsList 
    at com.wapice.xml.beans.Row 
    at private java.util.ArrayList com.wapice.xml.beans.Resultset.rowsList 
    at com.wapice.xml.beans.Resultset 

然后,我改变了相关干将的名字/ setter方法&它工作得很好。 以下是我如何改变它。

---------------- 
Class Resultset 
---------------- 

@XmlElement(required = true, name = "row") 
private ArrayList<Row> rowsList; // I kept the same name for this attribute 


public ArrayList<Row> getRowsList() { // I changed this to getRows() 
return rowsList; 
} 


public void setRowsList(ArrayList<Row> rowsList) { // I changed this to setRows() 
this.rowsList = rowsList; 
} 


---------- 
Class Row 
---------- 

@XmlElement(required = true, name = "field") 
private ArrayList<Field> fieldsList; // I kept the same name for this attribute 


public void setFieldsList(ArrayList<Field> fieldsList) { // I changed this to getFields() 
this.fieldsList = fieldsList; 
} 

public ArrayList<Field> getFieldsList() { // I changed this to setFields() 
return fieldsList; 
} 

希望这可以帮助别人。

+1

发生异常是因为默认访问类型为PUBLIC_MEMBER,并且由于注释位于字段JAXB上,因此认为您将字段和属性映射到同一个XML元素。以下文章应该可以帮助你:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html –

2

你可以引入一个Field对象:

package com.wapice.xml.beans; 

import javax.xml.bind.annotation.*; 

public class Field { 
    @XmlAttribute name; 
    @XmlValue value; 
} 

而且具有对象守住它们的列表:

package com.wapice.xml.beans; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 


@XmlRootElement(name = "row") 
@XmlType(propOrder = {"field"}) 
public class Row { 

    private List<Field> fields; 

    @XmlElement(required = true, name = "field") 
    public List<Field> getFields() { 
     return field; 
    } 

    public void setField(List<Field> fields) { 
     this.fields = fields; 
    } 

} 

更多信息