Saxon:无法在 .NET 中使用模式打开 XML,在 Java 中工作正常

Posted

技术标签:

【中文标题】Saxon:无法在 .NET 中使用模式打开 XML,在 Java 中工作正常【英文标题】:Saxon: Can't open XML with schema in .NET, works fine in Java 【发布时间】:2018-12-04 03:41:36 【问题描述】:

我正在尝试创建 Saxon XPathCompiler。我在 Java 和 .NET 中有相同的代码,每个都调用适当的 Saxon 库。代码是:

protected void ctor(InputStream xmlData, InputStream schemaFile, boolean preserveWhiteSpace) throws SAXException, SchemaException, SaxonApiException 
    this.rootNode = makeDataSourceNode(null);
    XMLReader reader = XMLReaderFactory.createXMLReader();

    InputSource xmlSource = new InputSource(xmlData);
    SAXSource saxSource = new SAXSource(reader, xmlSource);
    Source schemaSource = new StreamSource(schemaFile);
    Configuration config = createEnterpriseConfiguration();
    config.addSchemaSource(schemaSource);
    // ...

在 .NET 的情况下,InputStreams 是一个封装 .NET Stream 并使其成为 Java InputStream 的类。对于 Java,上面的代码可以正常工作。但在 .NET 中,最后一行 config.addSchemaSource(schemaSource) 会抛出:

$exception "内容不允许在 序言。" org.xml.sax.SAXParseException

在 Java 和 .NET 中,如果没有架构,它就可以正常工作。

它使用的文件是http://www.thielen.com/test/SouthWind.xml & http://www.thielen.com/test/SouthWind.xsd

It does not appear to be any of the issues in this question. 如果这就是问题所在,那么 Java 和 .NET 不应该有同样的问题吗。

我在想也许是 .NET Stream 的包装使其成为 Java InputStream,但我们在任何地方都使用该类而没有任何其他问题。

【问题讨论】:

【参考方案1】:

“Prolog 中不允许内容”异常绝对令人愤怒——只要它告诉你它所抱怨的字节是什么!一种诊断技术是显示 InputStream 传递的初始字节:在

上进行几次调用
System.err.println(schemaFile.next())

我对原因的第一个猜测可能与字节顺序标记有关,但我不会推测,而是专注于诊断,以查看解析器在 InputStream 中看到的它不喜欢的内容。

【讨论】:

我通过将两个文件显式设置为 utf-8 编码来修复它(以前 xml 文件没有规范,xsd 是 utf-16)。但编码不应该有所作为...... 嘿,你写的是撒克逊语。你不能给我们更多关于例外的信息吗?谢谢 - 戴夫 Saxon 调用外部 XML 解析器进行解析:默认情况下,它使用 JDK 中的 XML 解析器。有时,您可以通过将 Saxon 配置为使用不同的解析器来获得更好的诊断(但 Xerces 现在已经很好地垄断了市场)。 哦...好吧,现在这一切都说得通了。

以上是关于Saxon:无法在 .NET 中使用模式打开 XML,在 Java 中工作正常的主要内容,如果未能解决你的问题,请参考以下文章

Saxon-EE在验证错误中截断内容

无法将 element(transactionDate, xs:anyType) 类型的值类 net.sf.saxon.tinytree.TinyElementImpl 转换为类 java.util.

如何在 .NET 中使用 Saxon-HE 9.8 使用 XSLT 3.0

使用 Saxon-JS 识别 XSLT 转换的性能瓶颈

使用 Saxon 时如何停止样式表文件锁定?

将 Xalan 与 Saxon 一起使用