2012-10-10 31 views
3

從一些圖書館,我得到這樣的輸入字符串:如何使用JAXB解組一個根元素?

<link> 
    <name>button1</name> 
    <target>there</target> 
</link> 
<link> 
    <name>button2</name> 
    <target>there2</target> 
</link> 

(請注意,這不是因爲它沒有根的XML文檔),我有這個類:

@XmlRootElement(name = "link") 
public class TableTagLinkElement { 
    private String name; 
    private String target; 

    // getters and setters 
} 

我怎樣才能解組容易進的TableTagLinkElement S,在一個通用的方式列表這使得我可以實現這樣的方法:

public <T> List<T> parseCollection(String xmlString, Class<T> rootClass) 

即,沒有任何關於TableTagLinkElement類別或<link>標籤名稱的知識?

我知道解決方案create a wrapper class with a list,但我認爲他們不適用於這裏嗎?

回答

2

如果你可以用完整的XML字符串周圍<root>...</root>元素,那麼你可以創建一個XMLStreamReader從字符串讀取,然後遍歷所有的讀者,解組各link,當您去。例如(省略了異常處理)

public <T> List<T> parseCollection(String xmlString, Class<T> rootClass) { 
    XMLInputFactory inFac = XMLInputFactory.newFactory(); 
    XMLStreamReader reader = inFac.createXMLStreamReader(
        new StringReader("<root>" + xmlString + "</root>")); 
    reader.nextTag(); // move to the <root> tag 
    reader.nextTag(); // move to the first child 
    List<T> list = new ArrayList<T>(); 
    while(reader.getEventType() == XMLStreamConstants.START_ELEMENT) { 
    list.add(declaredType.cast(unmarshaller.unmarshal(reader))); 

    // unmarshal leaves the reader pointing at the event *after* the 
    // closing tag, not the END_ELEMENT event itself, so we can't just 
    // do nextTag unconditionally. We may already be on the next opening 
    // tag or the closing </root> but we might need to advance if there 
    // is whitespace between tags 
    if(reader.getEventType() != XMLStreamConstants.START_ELEMENT && 
     reader.getEventType() != XMLStreamConstants.END_ELEMENT) { 
     reader.nextTag(); 
    } 
    } 
    reader.close(); 
    return list; 
} 
+0

太棒了,這個效果很好。非常感謝! –