gpt4 book ai didi

java - 我们可以在 Java 中使用带有 SAX 解析器的 xslt 转换吗?

转载 作者:行者123 更新时间:2023-11-30 06:38:25 25 4
gpt4 key购买 nike

我有一个 xm 文件,我已使用 XSLT 转换 通过 DOM 对其进行了解析,并将数据存储到 csv 中。

但现在我想在 SAX 中执行此操作,因为 xml 文件非常大。

现在我的问题是我们可以使用 xslt 转换与 SAX 解析器 并将数据存储到 csv 中吗?

我到处搜索,但没有得到任何有用的信息。

这是我用 DOM 编写的 java 代码

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;

class Xml2Csv {

public static void main(String args[]) throws Exception {
// Setting path for .xsl file
File stylesheet = new File("style.xsl");

// Setting path for Eurex xml feed file
File xmlSource = new File("eurex_ref_data.xml");

//Dom initialization and parse xml
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(xmlSource);

// Transformation of parsed xml to csv
StreamSource stylesource = new StreamSource(stylesheet);
Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);
Source source = new DOMSource(document);
//System.out.println(source.toString());
System.out.println("Generating CSV File");
Result outputTarget = new StreamResult(new File("AID.csv"));
transformer.transform(source, outputTarget);
System.out.println("File has been generated");
}
}

这是我的示例 XSLT 代码..

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >

<xsl:output method="text"/>

<xsl:template match="/">
<xsl:text>PriSetPx,TxnTm,ID,AltID,AltIDSrc</xsl:text>
<xsl:text>&#xA;</xsl:text>
<xsl:for-each select="FIXML/Batch/SecDef">
<xsl:variable name="secDef" select="concat(@PriSetPx,',',@TxnTm)" />
<xsl:for-each select="Instrmt/AID">
<xsl:value-of select="concat($secDef, ',',../@ID,',',@AltID,',',@AltIDSrc,'&#xA;')"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

提前致谢!

最佳答案

SAXSource https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/sax/SAXSource.html和 StreamSource https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/stream/StreamSource.html因此您根本不需要使用 DOM 即可将 XSLT 与 Java 结合使用。但您必须了解,XSLT 1.0 和 2.0 在任何情况下都会首先将完整的 XML 输入解析为对 XSLT/XPath 数据模型建模的树表示形式。因此,虽然 XSLT 1.0 或 2.0 处理器的 native 树模型可能比 DOM 树消耗更少的内存,但它肯定会随着输入的大小而增长。

对于您当前的代码,为了避免显式使用 DOM,您可以简单地使用 StreamSource (或者如果您确实想要 SAXSource)而不是 transformer.transform(source, outputTarget); 中的 >DOMSource

所以使用例如

File xmlSource = new File("eurex_ref_data.xml");
Source source = new StreamSource(xmlSource);

让 XSLT 处理器使用其 native 树表示。

如果您想要处理非常大的 XML 文档并遇到内存问题,那么您可能需要研究 XSLT 3.0 和 streaming (目前由 Saxon 9 EE, http://saxonica.com/html/documentation/using-xsl/embedding/jaxp-transformation.html 支持),例如,您添加到问题中的样式表可以轻松写为

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes="xs math"
version="3.0">

<xsl:mode streamable="yes"/>

<xsl:output method="text"/>

<xsl:template match="/">
<xsl:text>PriSetPx,TxnTm,ID,AltID,AltIDSrc</xsl:text>
<xsl:text>&#xA;</xsl:text>
<xsl:apply-templates select="FIXML/Batch/SecDef/Instrmt/AID"/>
</xsl:template>

<xsl:template match="AID">
<xsl:value-of select="ancestor::SecDef/@PriSetPx, ancestor::SecDef/@TxnTm, ../@ID, @AltID, @AltIDSrc" separator=","/>
<xsl:text>&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>

然后可以轻松地与 Saxon 9.7 或 9.8 EE ( http://saxonica.com/download/download_page.xml ) 一起使用并通过流式传输来创建 CSV,而无需消耗大量内存,因为 XSLT 和流式传输避免了首先构建完整输入的树,而是读取 XML仅一次,仅转发,逐节点处理。

或者,如果您有非常大的输入文档,请考虑使用像 BaseX 或 ExistDB 这样的 XML 数据库(我不确定它们对 XSLT 的支持有多好,它们专注于 XQuery)。

关于java - 我们可以在 Java 中使用带有 SAX 解析器的 xslt 转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44841466/

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