加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Saxon in Java:指定SAX Parser

发布时间:2020-12-15 02:35:26 所属栏目:Java 来源:网络整理
导读:查看 the Saxon documentation,命令行上有一个“-x:className”标志,用于指定在应用XSLT期间使用的特定SAX解析器. 如何以编程方式实现此目标?我现在正在我的代码中使用s9api,我检查了Processor,XsltCompiler,XsltExecutable和XsltTransformer对象;他们都没
查看 the Saxon documentation,命令行上有一个“-x:className”标志,用于指定在应用XSLT期间使用的特定SAX解析器.

如何以编程方式实现此目标?我现在正在我的代码中使用s9api,我检查了Processor,XsltCompiler,XsltExecutable和XsltTransformer对象;他们都没有办法设置SAX解析器.我还实例化了一个net.sf.saxon.Transform,它也没有任何东西.

我很可能正在查看错误的对象集,但我不知道我应该怎么知道正确的集合是什么.

命令行文档链接到上面提到的“为源文件使用指定的SAX解析器和使用document()函数加载的任何文件.”我敢肯定,如果我知道自己在做什么,那么提及“document()”函数会立刻引起我的注意.不幸的是,我没有,也没有.

编辑:迈克尔凯的答案是正确的. (当然是!他是撒克逊家伙!)我想我会为后代添加一些示例代码.

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

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

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

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本身没有任何关系,而是我在自定义SAXParser的实现中搞乱了.

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解析器的实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读