2011-11-17 175 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; 
    } 

} 

更多信息