gpt4 book ai didi

java - Java 中的撒克逊语 : Specify SAX Parser

转载 作者:搜寻专家 更新时间:2023-11-01 03:42:20 24 4
gpt4 key购买 nike

正在寻找the Saxon documentation命令行上有一个“-x:className”标志,用于指定在应用 XSLT 期间使用的特定 SAX 解析器。

如何以编程方式实现这一目标?我现在在我的代码中使用 s9api,我检查了 ProcessorXsltCompilerXsltExecutableXsltTransformer对象;他们都没有办法设置 SAX 解析器。我还实例化了一个 net.sf.saxon.Transform,但它也没有任何内容。

我很可能看到了错误的对象集,但我不知道我应该如何知道正确的对象集是什么。

链接到上面提到的“使用指定的 SAX 解析器为源文件和加载的任何文件使用 document() 函数”的命令行文档。我敢肯定,如果我知道自己在做什么,这个“document()”函数的提及会立即让我明白。不幸的是,我不知道,它也不知道。

编辑:Michael Kay 在下面的回答是正确的。 (当然是!他是撒克逊人!)我想我应该为后代添加一些示例代码。

首先,他使用 net.sf.saxon.s9api.Processor 的解决方案:

Processor processor = new Processor(false);
processor.setConfigurationProperty(FeatureKeys.SOURCE_PARSER_CLASS,
"fully.qualified.package.name.of.MySAXParser");

在上面,重要的是向它提供 SAXParser 的完全限定名称(而不仅仅是类名)作为字符串。如果您执行以下操作:

processor.setConfigurationProperty(FeatureKeys.SOURCE_PARSER_CLASS,
new MySAXParser());

...你会得到这个:

java.lang.IllegalArgumentException: SOURCE_PARSER_CLASS class must be a String

其次,他使用 net.sf.saxon.s9api.XsltTransformer 的解决方案:

// ^^^ Various setup code to get to this point...
XsltTransformer transformer = xsltExecutable.load();
File file = new File("/path/to/my/file");
InputStream fileInputStream = new FileInputStream(file);
InputSource inputSource = new InputSource(fileInputStream);
Source saxSource = new SAXSource(new MySAXParser(), inputSource);
transformer.setSource(saxSource);
// vvv Set other parameters, actually invoke the transform, etc...

我唯一的问题/警告是:

1.) 在控制台中打印出以下消息:

Cannot find CatalogManager.properties

这似乎没有任何影响,因为转换仍然工作得很好,而且我很确定它与 Saxon 本身没有任何关系,而是我在自定义实现中搞砸了SAX 解析器。

2.) 如果我想转换一个非 XML 文档(是的,这完全有可能),我不能使用解决方案 #2,因为调用 XsltTransform.setSource() 会导致它默认将源作为 XML 查看文件,并会给你可怕的

Error on line 1 column 1 
SXXP0003: Error reported by XML parser: Content is not allowed in prolog.

因此,对于转换非 XML 文档,您必须使用“粗粒度”处理器解决方案。

最佳答案

如果您想确保获得 Saxon 问题的答案,请使用 dev.saxonica.com 上的 Saxon 论坛,或 SourceForge 上的 saxon-help 列表。

答案是:可以用

Processor.setConfigurationProperty(
FeatureKeys.SOURCE_PARSER_CLASS, parserClassName)

然而,这可能有点粗粒度:它在命令行上工作,因为配置通常只是为了转换一个文档而设置的。为了更好地控制,您始终可以以 SAXSource 对象的形式向转换提供输入,该对象包含一个 XMLReader,代表您要使用的 SAX 解析器的一个实例。

关于java - Java 中的撒克逊语 : Specify SAX Parser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11317066/

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