2012-09-28 53 views
2

我有一個對象「Role」,它可以包含多個「Privileges」,它們也是對象。現在,當我試圖序列角色與西河我的XML看起來是這樣的:XStream刪除集合中不需要的字段

<role> 
    <roleName>Administrator</roleName> 
    <privileges class="org.hibernate.collection.PersistentSet"> 
     <set> 
     <privilege> 
      <privilegeId>1001</privilegeId> 
      <privilegeName>Admin Privilege</privilegeName> 
      <privilegeKey>Admin</privilegeKey> 
     </privilege> 
     </set> 
     <initialized>true</initialized> 
     <owner class="role" reference="../.."/> 
     <cachedSize>-1</cachedSize> 
     <rolemodel.valueobject.Role.privileges</role> 
     <key class="int">3</key> 
     <dirty>false</dirty> 
     <storedSnapshot class="map"> 
     <entry> 
      <privilege reference="../../../set/privilege"/> 
      <privilege reference="../../../set/privilege"/> 
     </entry> 
     </storedSnapshot> 
    </privileges> 
    </role> 

我希望它看起來像這樣:

<role> 
    <roleName>Administrator</roleName> 
    <privileges> 
      <privilegeId>1001</privilegeId> 
      <privilegeName>Admin Privilege</privilegeName> 
      <privilegeKey>Admin</privilegeKey> 
    </privileges> 
    </role> 

我怎麼能忽略/刪除/不包括所有這些附加字段?看起來他們是「實用」字段,由hibernate添加,因​​爲我沒有在我的hbm.xml中聲明它們。 我已經嘗試省略它們,將特權集合添加爲隱式和我在XStream頁面上找到的其他內容。

編輯 我失敗瞭如下建議創建XSLT模板,卻發現自定義轉換器是非常好,簡單的工具來做好這項工作。查看此處的幫助頁面 - http://x-stream.github.io/converter-tutorial.html。 這是我的名帥方法:

public void marshal(Object value, HierarchicalStreamWriter writer, 
        MarshallingContext context) { 
    Role role = (Role) value; 
    writer.startNode("roleId"); 
    writer.setValue(role.getRoleId().toString()); 
    writer.endNode(); 
    writer.startNode("roleName"); 
    writer.setValue(role.getRoleName()); 
    writer.endNode(); 
    writer.startNode("privileges"); 
    for (Privilege privilege : role.getPrivileges()){ 
     writer.startNode("privilege"); 
     writer.setValue(privilege.getPrivilegeName()); 
     writer.endNode(); 
    } 
    writer.endNode(); 
} 

和XML它產生:

<role> 
    <roleId>3</roleId> 
    <roleName>Web Administrator</roleName> 
    <privileges> 
     <privilege>Web Access</privilege> 
    </privileges> 
    </role> 

回答

0

您可以使用XSL來轉換XML

XStream的用的SAXSource實現,它允許XStream的交付實例成爲XML變換器的來源。

例 請看下面的樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="no"/> 
    <xsl:template match="/cat"> 
    <xsl:copy> 
     <xsl:apply-templates select="mName"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

此處用它來去除飛貓的年齡(假設XSLT是與上面的樣式表的字符串):

XStream xstream = new XStream(); 
xstream.alias("cat", Cat.class); 

TraxSource traxSource = new TraxSource(new Cat(4, "Garfield"), xstream); 
Writer buffer = new StringWriter(); 
Transformer transformer = TransformerFactory.newInstance().newTransformer(
    new StreamSource(new StringReader(XSLT))); 
transformer.transform(traxSource, new StreamResult(buffer)); 

,緩衝區中的結果:

<cat> 
    <mName>Garfield</mName> 
</cat> 

檢查this link僅供參考

+0

感謝您的建議。不幸的是,我沒有得到它的工作 - 我想,xsl有一個陡峭的學習曲線。 –