gpt4 book ai didi

java - 在 Java 中读取 XML 元素列表

转载 作者:数据小太阳 更新时间:2023-10-29 02:05:37 31 4
gpt4 key购买 nike

我想遍历一个 XML 文档,它本质上是一个结构相同的 XML 元素的列表。这些元素将被序列化为 Java 对象。

<root>
<element attribute="value" />
<element attribute="value" />
<element attribute="value" />
...
</root>

根元素中有很多元素。我不想将它们全部加载到内存中。我意识到我可以为此使用 SAX 处理程序,但是使用 SAX 处理程序将所有内容反序列化为 Java 对象似乎相当迟钝。我发现 JDOM 非常易于使用,但据我所知,JDOM 总是解析整个树。有没有一种方法可以使用 JDOM 一次解析一个子元素?

使用 JDOM 的另一个原因是它使得为相应的 Java 对象编写序列化/反序列化代码变得容易,如果这些对象不完全在内存中就没有意义。但是,我不想同时将所有 Java 对象加载到内存中。相反,我想对它们进行一次迭代。

更新:这里是如何在 dom4j 中执行此操作的示例:http://docs.codehaus.org/display/GROOVY/Reading+XML+with+Groovy+and+DOM4J .无论如何要在 jdom 中执行此操作?

最佳答案

为什么不使用 StAX(javax.xml.stream.*,一个实现包含在 Java SE 6 中)在 XML 中流式传输,并将各个部分转换为对象?

import java.io.FileReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Element.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();

XMLInputFactory xif = XMLInputFactory.newFactory();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));
xsr.nextTag();
xsr.nextTag();
while(xsr.hasNext()) {
Element element = (Element) unmarshaller.unmarshal(xsr);
System.out.println(element.getAttribute());
if(xsr.nextTag() != XMLStreamReader.START_ELEMENT) {
break;
}
}
}

}

在上面的示例中,每个单独的“元素”都使用 JAXB(Java SE 6 中包含一个实现)解码到 POJO 中,但是您可以按照您认为合适的方式处理该片段。 JAXB 模型详细信息如下:

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Element {

private String attribute;

@XmlAttribute
public String getAttribute() {
return attribute;
}

public void setAttribute(String attribute) {
this.attribute = attribute;
}

}

注意:

StAX 和 JAXB 也兼容 Java SE 5,您只需要单独下载实现即可。

关于java - 在 Java 中读取 XML 元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5734330/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com