2010-09-16 45 views
2

我有類似於這樣的一個類:定製XStream的輸出

class foo { 
    List<String> bar; 
    ... 
} 

我加四根弦到列表bar

bar.add("1"); 
bar.add("2"); 
bar.add("3"); 
bar.add("4"); 

使用XStream的,我已經成功地得到輸出看起來像這樣:

<foo> 
    <bar> 
    <blah>1</blah> 
    <blah>2</blah> 
    <blah>3</blah> 
    <blah>4</blah> 
    </bar> 
</foo> 

但是,我需要的XML看起來像這樣:

<foo> 
    <bar> 
    <blah id="1"/> 
    <blah id="2"/> 
    <blah id="3"/> 
    <blah id="4"/> 
    ... 
    </bar> 
</foo> 

有人能幫助我嗎?

回答

0

如果XStream不支持這種情況,可以使用MOXy JAXB來完成。您將需要使用@XmlPath註釋:

import java.util.List; 
import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
class Foo { 
    @XmlPath("bar/blah/@id") 
    List<String> bar; 
} 

可以產生以下XML:

<?xml version="1.0" encoding="UTF-8"?> 
<foo> 
    <bar> 
     <blah id="1"/> 
     <blah id="2"/> 
     <blah id="3"/> 
     <blah id="4"/> 
    </bar> 
</foo> 

有了這個演示代碼:

import java.util.ArrayList; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 

     Foo foo = new Foo(); 
     foo.bar = new ArrayList<String>(); 
     foo.bar.add("1"); 
     foo.bar.add("2"); 
     foo.bar.add("3"); 
     foo.bar.add("4"); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(foo, System.out); 
    } 
} 

欲瞭解更多信息,請參閱:

+0

感謝您的回答。我設法使用XStream'CollectionConverter'來獲得我想要的輸出。 – pingping 2010-09-16 17:40:32

3

您可以通過以下操作得到你想要的輸出:

1:創建布拉赫類,除非你想所有字符串的行爲顯示爲屬性。

@XStreamAlias("blah") 
public class Blah { 
    @XStreamAsAttribute 
    String id; 

    Blah(){}; 

    Blah(String s) { 
    this.id = s; 
    } 
} 

2:您的Foo有無聊症

集合
@XStreamAlias("foo") 
public class Foo { 
    List<Blah> bar = new ArrayList<Blah>(); 
} 

3:告訴XStream的處理註釋

XStream xstream = new XStream(); 
xstream.processAnnotations(Foo.class); 
xstream.processAnnotations(Blah.class); 
System.out.println(xstream.toXML(f)); 

4:這是輸出:

<foo> 
    <bar> 
    <blah id="1"/> 
    <blah id="2"/> 
    <blah id="3"/> 
    <blah id="4"/> 
    </bar> 
</foo> 
+0

感謝您向我展示這種處理xstream的方式。我不知道它支持註釋。我也會試試這個方法。 – pingping 2010-10-08 22:41:36

+0

不客氣! – pablosaraiva 2010-10-13 01:39:11