您需要對模式進行小調整。相反的:
<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
時運行計數方法,然後總結計數,但是您希望計數。祝你好運!
您能否發佈相關代碼段,從輸出序列化「」?我相信這是一個集合,並且您需要將'tailRecord'屬性添加到Java bean中,該屬性包含集合中元素的數量。 –
命令'$ xmlstarlet sel -t -v'sum(//記錄)'file.xml'打印記錄總數 – kev