2017-04-06 151 views
0

好的 - 我知道這應該是非常簡單的 - 但出於某種原因 - 我無法讓它工作!將原始XML字符串轉換爲java對象列表?

可以說我有以下POJO:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class PlainOldJavaObject implements Serializable { 

    private long uuid; 
    private String name; 

    public PlainOldJavaObject() { 
    } 

    public long getUuid() { 
     return this.uuid; 
    } 

    public void setUuid(long uuid) { 
     this.uuid = uuid; 
    } 

    public String getNamen() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    /* Omitted HashCode & Equals for brevity. */ 
} 

而且可以說我有下面的XML(我已經格式化它readabilty - 我真的把它作爲原料,格式化字符串):

<PlainOldJavaObjects> 
    <PlainOldJavaObject> 
     <uuid>8119</uuid> 
     <name>Jimmy</name> 
    </PlainOldJavaObject> 
    <PlainOldJavaObject> 
     <uuid>2372</uuid> 
     <name>Johns</name> 
    </PlainOldJavaObject> 
</PlainOldJavaObjects> 

如何在活着的地獄我把那個XML變成一個List實例?

我嘗試使用的XStream - 如下:

XStream xStream = new XStream(); 
List<PlainOldJavaObject> endResultHopefully = (List<PlainOldJavaObject>) xStream.fromXML(result); 

但這一切確實是看似以下內容打印到我的終端...

PlainOldJavaObjects : PlainOldJavaObjects 

什麼我到底錯在這裏做什麼?

注意:添加JAXB TAG因爲從谷歌搜索這一點 - 我看到這個存在,我會假設它可能是我想要的 - 但我不知道,也許有人OVER在社會可能,也爲我指點?

+0

使用JAXB。這就是它所做的。 – Rob

+0

我似乎無法找到一個列表使用jaxb的例子,而無需編寫一個包含該列表的包裝類。這不是我能夠爲這個項目帶來變化的東西。 – MickeyThreeSheds

+1

jaxb模型將每個元素(實際上是複雜類型)映射到Java類,這就是爲什麼您的「PlainOldJavaObjects」元素需要一個類。在我看來,使用jaxb的最好方法是將它從XSD驅動出來,並且在編譯時生成所有的pojos(具有所有必要的註釋)。這是更少的代碼來維護和代碼模式很容易習慣。如果您使用XML,Jaxb絕對是您的選擇 - 不確定如何說服那些「功能強大」......祝您好運。 – Rob

回答

0

使用XStream並使用@XStreamImplicit將您的類包裝在包含PlainOldJavaObject列表的PlainOldJavaObjects類中。 這裏是一個例子。首先,

@XStreamAlias("PlainOldJavaObject") 
public class PlainOldJavaObject implements Serializable 
{ 

    private long uuid; 
    private String name; 


    public PlainOldJavaObject() 
    { 
    } 


    public long getUuid() 
    { 
     return this.uuid; 
    } 

    public void setUuid(long uuid) 
    { 
     this.uuid = uuid; 
    } 

    public String getNamen() 
    { 
     return this.name; 
    } 

    public void setName(String name) 
    { 
     this.name = name; 
    } 
} 

添加@XStreamImplicit添加註釋到您的PlainOldJavaObject類PlainOldJavaObject列表

@XStreamAlias("PlainOldJavaObjects") 
public class PlainOldJavaObjects 
{ 

    @XStreamImplicit 
    private List<PlainOldJavaObject> pojoList = new 
ArrayList<PlainOldJavaObject>(); 

    public void addPojo(final PlainOldJavaObject pojo) 
    { 
     pojoList.add(pojo); 
    } 

    public List<PlainOldJavaObject> getList() 
    { 
     return pojoList; 
    } 
} 

類測試的結果。首先將產生的xml寫出到一個字符串中。然後使用字符串創建您需要的列表。從XML

public class TestXML 
{ 

    @Test 
    public void testXML() 
    { 
     PlainOldJavaObjects pojos = new PlainOldJavaObjects(); 

     PlainOldJavaObject pojo = new PlainOldJavaObject(); 

     pojo.setName("Jimmy"); 
     pojo.setUuid(8119); 

     pojos.addPojo(pojo); 

     PlainOldJavaObject pojo2 = new PlainOldJavaObject(); 
     pojo2.setName("Johns"); 
     pojo2.setUuid(2372); 

     pojos.addPojo(pojo2); 

     XStream xstream = new XStream(); 
     xstream.processAnnotations(PlainOldJavaObjects.class); 
     xstream.processAnnotations(PlainOldJavaObject.class); 

     String xml = xstream.toXML(pojos); 
     System.out.println(xml); 

     PlainOldJavaObjects pojos2 = (PlainOldJavaObjects) 
xstream.fromXML(xml); 

     // list with two PlainOldJavaObject 
     assertEquals(2, pojos2.getList().size()); 
    } 
} 

輸出:

<PlainOldJavaObjects> 
    <PlainOldJavaObject> 
    <uuid>8119</uuid> 
    <name>Jimmy</name> 
    </PlainOldJavaObject> 
    <PlainOldJavaObject> 
    <uuid>2372</uuid> 
    <name>Johns</name> 
    </PlainOldJavaObject> 
</PlainOldJavaObjects>