我使用非常大的XML数据集(1gb以上),需要根据后面的其他元素的值回溯和更新每个节点的特定元素。
例如,在这个记录/node中:
<user>
<role>Associate</role>
<team>Hufflepuff</team>
<experience>7</experience>
</user>
自"experience"大于5年,角色需要从"associate"更新为"associate"。"高级!">
我想避免通过DOM将整个文件加载到内存中。
理想情况下,我会处理每个单独的"用户"。并将数据一次一个地附加到新的XML文件中。我开始使用StAX在流中进行处理,但我不知道如何将每个XMLEventWriter事件内容转换为一个可用的DOM文档,该文档写入XML文件,然后从内存中清除。
如果描述有任何不清楚的地方,请让我知道。如有任何帮助,我将不胜感激。
谢谢。
在XSLT 3.0中使用流,您可以
<xsl:template match="user" mode="streamed">
<xsl:apply-templates select="copy-of(.)" mode="unstreamed"/>
</xsl:template>
,在非流模式下,你可以处理(复制的)user
元素作为内存中的子树,没有流限制。
我对SAX做了同样的事情;当你点击user
的startElement事件开始构建树时,当相应的endElement事件发生时,以任何你喜欢的方式处理树是很容易的。
我不会使用像StAX这样的pull API。我相信这是可以做到的,但可能需要更多的努力。