xml - 如何使用 JAXB 解码根元素的集合?

标签 xml serialization collections 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 的解决方案,但我认为它们在这里不适用,对吗?

最佳答案

如果你能包装一个<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;
}

关于xml - 如何使用 JAXB 解码根元素的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12822683/

相关文章:

Java 编程到接口(interface)我应该一直使用它,尤其是对于集合

java - 设置微调器中条目的文本大小(spinnerMode ='Dialog')

c# - 通过 XSLT 在 XML 中格式化日期

c# - WCF 是否需要 DataContract 属性

java - 如何使用泛型将重复的方法与具有包含相同类类型的不同 Java 集合的参数组合起来?

.net - 带有事件的集合 - 还有比 BindingList(of T) 更好的选择吗?

java - 所有值类型都是不可变的任何 Java XML 树库

java - java中xml文档的问题

python迭代json结构和键值未知的json文件

android - 数组的预期开始 '[' ,但有 'EOF' 而不是