2012-10-10 4 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 
} 

public <T> List<T> parseCollection(String xmlString, Class<T> rootClass) 
: 어떻게 내가 이러한 방법을 구현할 수 있도록 쉽게 TableTagLinkElement의, 일반적인 방법으로 의 목록에이 언 마샬링 할 수 있습니다

즉, 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

대단합니다. 고마워요! –

관련 문제