3

いくつかのライブラリから、次のような入力文字列を取得しています。

<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これを簡単にリストにアンマーシャリングするにはどうすればよいですか。

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

TableTagLinkElementつまり、クラスや<link>タグの名前についての予備知識がない場合はどうでしょうか。

リストを使用してラッパークラスを作成するソリューションについては知っていますが、ここでは適用できないと思いますか?

4

1 に答える 1

2

<root>...</root>完全なXML文字列の周りに要素をラップできる場合は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;
}
于 2012-10-10T15:49:01.783 に答える