【问题标题】:How do I open a JSON file in Saxon 10.1?如何在 Saxon 10.1 中打开 JSON 文件?
【发布时间】:2020-07-17 15:17:34
【问题描述】:

the instructions in the Saxonica documentation 之后,我的代码非常适合打开 XML 文件。

但是当我使用相同的代码打开 JSON 文件时,我得到:

Caused by: net.sf.saxon.s9api.SaxonApiException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at net.sf.saxon.s9api.DocumentBuilder.build(DocumentBuilder.java:360)
    at net.windward.datasource.xml.SaxonDataSource.ctor(SaxonDataSource.java:231)
    at net.windward.datasource.xml.SaxonDataSource.<init>(SaxonDataSource.java:154)
    ... 2 more
Caused by: net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:459)
    at net.sf.saxon.event.Sender.send(Sender.java:142)
    at net.sf.saxon.Configuration.buildDocumentTree(Configuration.java:4184)
    at net.sf.saxon.s9api.DocumentBuilder.build(DocumentBuilder.java:357)
    ... 4 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:994)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:841)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:439)
    ... 7 more

我需要做些什么不同的事情?

【问题讨论】:

    标签: json saxon


    【解决方案1】:

    你还没有告诉我们你在做什么,所以很难说你应该做些什么不同的事情。但很明显,您正在向需要 XML 的接口提供 JSON 文件。

    加载json最简单的方法是使用json-doc()函数。

    【讨论】:

    • 在我的 Java 代码中,我在哪里/如何调用 json-doc() 方法?您是否有与 saxonica.com/documentation/index.html#!xpath-api/s9api-xpath 的示例类似的示例,用于加载 XML 文件的代码?
    • json-doc() 是一个 XPath 函数。如果您想从 Java 中调用它,您可以通过评估 XPath 来实现。在撒克逊人中,您也可以尝试调用静态方法net.sf.saxon.ma.json.ParseJsonFn.parse(),但您必须弄清楚如何设置参数。 (注意:该方法的 javadoc 是错误的,结果通常是映射或数组,而不是 XML 元素)。
    • 您也可以使用XdmFunctionItem.getSystemFunction() 将函数作为XdmFunctionItem 获取,然后XdmFunctionItem.call() 调用它。
    • 好吧,我可能做了一个巨大的错误假设。对于 XML InputStream(文件),我按照建议的代码加载它,完成后,我有一个 XdmNode,它是整个 XML 的根,还有一个 XPathCompiler,我可以使用它来对 xml 运行查询。我假设 JSON 是相同的,我可以以某种方式读取 JSON InputStream(文件)并获得 XdmNode 和 XPathCompiler。这不正确吗?在那种情况下,XPath 3.1 上下文中的“JSON 支持”究竟是什么?
    • s9api API 提供了一个 DocumentBuilder,允许您解析词法 XML 并构建一个表示解析树的 XdmNode。它不提供解析 JSON 的等价物——只能在 XPath 中完成。遗漏注明。这是 s9api API 中的一个缺口,而不是 XPath。
    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 2018-11-16
    • 2016-01-19
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多