当XML数据太大而无法放入内存时,如何在Java中访问XML数据的子集?
我真正想要的是一个流式API,它的工作方式有点像StAX,也有点像DOM/JDom 从某种意义上说,它将是流式的,它将非常懒惰,直到需要时才阅读内容。它也将是流式的,即它将向前(而不是向后)读取所有内容 下面是使用这种API的代码的样子当XML数据太大而无法放入内存时,如何在Java中访问XML数据的子集?,java,xml,dom,Java,Xml,Dom,我真正想要的是一个流式API,它的工作方式有点像StAX,也有点像DOM/JDom 从某种意义上说,它将是流式的,它将非常懒惰,直到需要时才阅读内容。它也将是流式的,即它将向前(而不是向后)读取所有内容 下面是使用这种API的代码的样子 URL url = ... XMLStream xml = XXXFactory(url.inputStream()) ; // process each <book> element in this document. // the <b
URL url = ...
XMLStream xml = XXXFactory(url.inputStream()) ;
// process each <book> element in this document.
// the <book> element may have subnodes.
// You get a DOM/JDOM like tree rooted at the next <book>.
while (xml.hasContent()) {
XMLElement book = xml.getNextElement("book");
processBook(book);
}
URL=。。。
XMLStream xml=XXXFactory(url.inputStream());
//处理此文档中的每个元素。
//该元素可能有子节点。
//在下一步,您将得到一个类似DOM/JDOM的树。
while(xml.hasContent()){
xmlement book=xml.getNextElement(“book”);
工艺手册;
}
是否存在类似的内容?解析文档部分而不将其完全加载到内存的唯一方法是使用SAX解析器
下面是一些有关如何使用SAX的官方SUN示例:您可以执行以下操作:
StringBuilder
,即创建您自己的XML文件副本endElement
,并且知道不需要刚才解析的子树,请清除StringBuilder
如果您需要提前知道树的边界,它也会有所帮助。(示例中的book元素)否则将需要进一步处理。您的意思是:“像SAX一样解析文件,直到遇到某个节点,然后从那里构建DOM树吗?”是的,我认为是这样。我只希望能够迭代大型XML文档的子集,并能够将每个子集视为DOM文档。我希望这是通用的,所以直到运行时我才知道要查找哪些节点,它们可以有任何结构(子节点/属性/等等)。我不认为我可以使用JAXB,因为XML文档没有模式,我宁愿使用XPath查询它们,因为我不知道在运行时之前我要查找哪些节点,而且它们可以有任何子节点、属性、CDATA等结构。我必须自己构建DOM文档。我想知道是否有什么东西可以让我不用这么做。我看到了StAX,但它似乎没有提供这一点。@Michael Jones-SAX是你的野兽。在调用end element事件时,SAX中有没有方法访问完整的元素?例如,如果我知道我正在寻找下一个“book”节点,如果SAX触发end element事件时,我可以编写“return xml.getElement()”并返回整个节点,那就太好了。据我所知,我只能访问单个元素的属性(例如属性、CDATA等),而不能访问整个节点及其子节点。我认为这是我最好的选择。我要试一试。谢谢