使用 JAXB 将 XML 解组为 Iterable<Long>

Unmarshalling XML to an Iterable<Long> using JAXB

我有一些非常简单的 XML 想要解组。我只对重复元素之一的值感兴趣。这是一些示例 XML:

<Document>
  <HeaderGuff>Whatever</HeaderGuff>
  <Foos>
    <FooId>1</FooId>
    <FooId>2</FooId>
  </Foos>
</Document>

我想使用 JAXB 来迭代 FooId 作为 Long

通常的示例需要使用 setFooIdgetFooId 方法创建数据 class。有没有办法直接解组到 Long 这样我就可以这样做:

for ( Long fooId : <something JAXB> )

我不想一次将所有标识符加载到内存中,因为它们可能有很多,并且一次只需要一个用于单独处理。

由于您只对其中一个元素感兴趣,不想一次将所有数据都存入内存,因此我会使用 StAX 解析器(包含在 JDK/JRE 中,因为 Java SE 6) 而不是此用例的 JAXB。

然后您可以将 XMLStreamReader 推进到 FooId 元素,对其进行处理,然后将其推进到下一个元素。

import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource source = new StreamSource("input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(source);

        while(xsr.hasNext()) {
            if(xsr.isStartElement() && "FooId".equals(xsr.getLocalName())) {
                long value = Long.valueOf(xsr.getElementText());
                System.out.println(value);
            }
            xsr.next();
        }

        xsr.close();
    }

}