2011-10-31 87 views
1

使用XStream LIB提供可計算的單個標籤,我的.xml結構應如下:XStream的:是全.XML

<record>value1</record> 
     ... 
<record>valueN</record> 
<tailRecord>recordsCount</tailRecord> 

tailRecord是整個.xml文件,最後和單個標籤。
它應該保持號碼record,所以應該是可以計算的。

是否可以使用XStream提供可計算標籤?
通用用例是以下幾點:
當執行用戶操作,record添加,並tailRecord值應爲updated

+1

您能否發佈相關代碼段,從輸出序列化「」?我相信這是一個集合,並且您需要將'tailRecord'屬性添加到Java bean中,該屬性包含集合中元素的數量。 –

+0

命令'$ xmlstarlet sel -t -v'sum(//記錄)'file.xml'打印記錄總數 – kev

回答

1

您需要對模式進行小調整。相反的:

<record>value1</record> 
<record>value2</record> 
... 
<record>valueN</record> 
<tailRecord>recordsCount</tailRecord> 

你將需要:

<records> 
    <record>value1</record> 
    <record>value2</record> 
    ... 
    <record>valueN</record> 
</records> 
<tailRecord>recordsCount</tailRecord> 

......那麼,如果你的對象看起來是這樣的:

public class RecordObject 
{ 
    private List<Integer> records; 

    // ... a bunch of code 

    public List<Integer> getRecords() 
    { 
     return records; 
    } 

    public int getRecordSize() 
    { 
     return records.size(); 
    } 
} 

然後XStream的兩條線是所有你需要:

XStream xstream = new XStream(); 
RecordObject recordObject = (RecordObject)xstream.fromXML("your-xml-example-as-a-string"); 

XStream will(by d默認)檢測到<record>value1</record>是類型爲int(或String或任何其他明顯的基元類型)的節點。然後,它會將多個<record>對象捆綁到合適自動裝箱類型的java.utils.collections.List中。

然後,您將能夠使用您的RecordObject像平時那樣:

System.out.println("There were " recordObject.getRecordCount() + " records found."); 

注:您可能必須與tailRecord XML元素的問題。我會建議刪除它或配置XStream忽略它,@XStreamOmitField註釋就像this示例演示的那樣。

我的觀點是,正確的OOD永遠不會允許一個對象包含事物列表,並且擁有一個代表列表大小的單獨屬性(recordCount)。你只需要設計一個對象(就像我上面的例子)來獲得這些東西的列表,並且最多隻需要一個便利的方法,如getRecordCount(),以便在運行時返回列表的大小。

我知道,由於其他原因(與傳統系統等接口),您可能需要那裏的tailRecord元素,但是由團隊通過XStream併成爲一個真正的Java對象,沒有什麼好用的它在Java土地。

而且,如果由於某種原因,我不明白你的問題,這不是你要找的答案,我最後的建議是查看。 Smooks實現了Visitor接口,並允許您在每次通過其內部SAXParser訪問XML節點時執行自定義處理。您可以將其配置爲在計數方法達到tailRecord時運行計數方法,然後總結計數,但是您希望計數。祝你好運!

+0

@sergionni我很感激這個回答對你有沒有幫助!如果沒有,我可以回到繪圖板。 – IAmYourFaja