【问题标题】:Java Saxon ParsingJava撒克逊解析
【发布时间】:2015-06-10 09:39:50
【问题描述】:

我正在使用 Saxon 解析器将大文件拆分为较小的文件。 下面是我的示例代码,

  TransformerFactory tFactory = TransformerFactory.newInstance();
           Transformer transformer = tFactory
                    .newTransformer(new StreamSource(new File(xsltPath)));
            StringWriter sw = new StringWriter();
            StreamResult result = new StreamResult(sw);
            transformer.transform(new StreamSource(new File(sourcePath)),
                    new StreamResult(new File(resultDir)));

其中 sourcePath = C:/path/Temp/AppModule.xml xsltPath = C:/path/Temp/create-fragment.xslt resultDir = C:/path/Temp/

此代码完美地将 AppModule.xml 拆分为较小的 xml 文件,但在控制台中除外,

错误 java.io.FileNotFoundException: C:\path\Temp(访问被拒绝) net.sf.saxon.trans.XPathException: java.io.FileNotFoundException: C:\path\Temp(访问被拒绝)

我搜索了一下,发现我应该为 new File() 方法指定确切的文件名。但正如您所见,我在编译时不知道文件名,只有在运行时解析器才会识别输入 AppModule.xml 并将 xml 拆分为更小的文件,其中包含 value 标记的名称。

AppModule.xml

    <?xml version='1.0' encoding='UTF-8'?>
<data>
<value>A1</value>
<value>B1</value>
<value>C1</value>
<value>A2</value>
<value>B2</value>
<value>C2</value>
</data>

输出: A1.xml:

<?xml version="1.0" encoding="UTF-8"?>
<test>A1</test>

同样会相应地创建B1,c1,A2,B2,C2文件。

请分享您宝贵的cmets。

【问题讨论】:

  • 您可以扫描目录并找到创建了哪些文件,然后将它们分配给它们的File 句柄。见:"How to scan a folder in Java"
  • 您确定您的问题不是:“访问被拒绝”?确保文件权限正确或将位置更改为程序可以访问的位置。

标签: java saxon


【解决方案1】:

您在结果对象中提供的文件不应是目录。如果转换没有产生“主要”输出文件,而只产生使用xsl:result-document 的输出,那么您应该将结果文件指定为new File("c:/path/temp/dummy.xml") 之类的东西。此文件将用作解析xsl:result-document/@href 中提供的任何相关文件名的“基本输出 URI”。

您使用的 API 称为 JAXP,问题是它是为 XSLT 1.0 设计的,您只能有一个结果文档。 Saxon 试图扩展 JAXP 中的概念以使其与 XSLT 2.0 一起使用,但它并不是真正为这项工作而设计的。您可能希望将 Saxon 的 s9api 界面作为替代方案。

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 2016-01-25
    • 2010-10-02
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多