Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当XML数据太大而无法放入内存时,如何在Java中访问XML数据的子集?_Java_Xml_Dom - Fatal编程技术网

当XML数据太大而无法放入内存时,如何在Java中访问XML数据的子集?

当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

我真正想要的是一个流式API,它的工作方式有点像StAX,也有点像DOM/JDom

从某种意义上说,它将是流式的,它将非常懒惰,直到需要时才阅读内容。它也将是流式的,即它将向前(而不是向后)读取所有内容

下面是使用这种API的代码的样子

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示例:

您可以执行以下操作:

  • 使用SAXStAX扫描XML文件,并立即将所有内容序列化回
    StringBuilder
    ,即创建您自己的XML文件副本

  • 如果遇到
    endElement
    ,并且知道不需要刚才解析的子树,请清除
    StringBuilder

  • 如果需要,可以从创建的“副本”构建DOM树

  • 有了它,您可以回到标准框架,一个用于常规SAX解析,另一个用于常规DOM构建。只有自定义序列化可能需要一些黑客操作


    如果您需要提前知道树的边界,它也会有所帮助。(示例中的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等),而不能访问整个节点及其子节点。我认为这是我最好的选择。我要试一试。谢谢