使用 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
。
通常的示例需要使用 setFooId
和 getFooId
方法创建数据 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();
}
}
我有一些非常简单的 XML 想要解组。我只对重复元素之一的值感兴趣。这是一些示例 XML:
<Document>
<HeaderGuff>Whatever</HeaderGuff>
<Foos>
<FooId>1</FooId>
<FooId>2</FooId>
</Foos>
</Document>
我想使用 JAXB 来迭代 FooId
作为 Long
。
通常的示例需要使用 setFooId
和 getFooId
方法创建数据 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();
}
}