使用JAXB </long>将XML解组为Iterable <long>

时间:2015-01-29 02:37:02

标签: java xml jaxb unmarshalling

我有一些非常简单的XML,我希望解组。我只对其中一个重复元素的值感兴趣。这是一些示例XML:

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

我想使用JAXB允许我将FooId作为Long进行迭代。

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

for ( Long fooId : <something JAXB> )

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

1 个答案:

答案 0 :(得分:2)

由于您只对其中一个元素感兴趣并且不想立即将所有数据都存入内存,因此我将使用StAX解析器(自Java SE 6以来包含在JDK / JRE中)而不是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();
    }

}