首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xml-to-json流式传输

xml-to-json流式传输
EN

Stack Overflow用户
提问于 2019-05-22 07:26:48
回答 1查看 172关注 0票数 0

我有许多非常大的XML文件,我希望将它们转换成(同样大的) JSON文件。为此,我编写了一个XSLT,它将XML转换为XSLT 3.0规范中指定的"XML- To -JSON表示“。然后,我可以调用fn:xml-to-json函数。

但是,我想让这个过程保持稳定的内存使用。这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 05:33:48

不幸的是,不可能(根据W3C的XSLT3.0规范,或者在Saxon实现中)在单个样式表中编写多阶段流转换。通常有两种编写多阶段转换的方法(即,由两个单独的转换组成的转换):第一阶段可以作为函数调用,或者第一阶段可以在变量中传递其结果。这两种机制都不允许中间结果(第一阶段的结果)以流式文档的形式交付。

(我们在设计规范时就意识到了这一限制,但决定将其从需求中去掉,因为事情已经变得足够复杂了。)

但我相信这可以在Saxon中完成,使用链接在一起的两个单独的样式表实现的多阶段转换。最简单的方法可能是使用s9api接口。编写第二个转换t2.xsl (简单地调用xml-to-json),如下所示:

代码语言:javascript
复制
<xsl:transform version="3.0" expand-text="yes"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode streamable="yes"/>
<xsl:output method="text"/>
<xsl:template match="/">{xml-to-json(.)}</xsl:template>
</xsl:transform>

然后执行以下操作:

代码语言:javascript
复制
Processor proc = new Processor(true);
Serializer out = proc.newSerializer(new File("out.xml");
XsltCompiler comp = proc.newXsltCompiler();
Xslt30Transformer t2 = comp.compile(new File("t2.xsl")).load30();
Destination phase2 = t2.asDocumentDestination(out);

Xslt30Transformer t1 = comp.compile(new File("t1.xsl").load30();
t1.applyTemplates(source, phase2);

注意:尽管输入文档和中间XML都是流式传输的,但输出JSON (我认为)在写出到输出文件之前是完全在内存中构造的。这有点不幸,我们应该试着修复它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56247497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档