【问题标题】:Saxon 8 (Java version) problemSaxon 8(Java版)问题
【发布时间】:2009-05-11 15:01:13
【问题描述】:

我现在要指出,我是使用 saxon 的新手,并且我已经尝试按照包中的文档和示例进行操作,但我只是没有运气解决这个问题。

基本上,我正在尝试使用 saxon v8 在 java 中进行一些 xml 处理。为了使某些东西正常工作,我采用了包中包含的一个示例文件并根据我的需要进行了修改。只要我不使用名称空间,它就可以工作,这是我的问题。如何解决命名空间问题?我真的不在乎使用它,但它存在于我的 xml 中,所以我要么必须使用它,要么忽略它。两种解决方案都可以。

无论如何,这是我的入门代码。它什么也不做,只是通过一个 xpath 查询尝试将它用于硬编码的 xml 文档。

public static void main(String[] args) {
    String query = args[0];

    File XMLStream=null;
    String xmlFileName="doc.xml";
    OutputStream destStream=System.out;
    XQueryExpression exp=null;
    Configuration C=new Configuration();
    C.setSchemaValidation(false);
    C.setValidation(false);

    StaticQueryContext SQC=new StaticQueryContext(C);
    DynamicQueryContext DQC=new DynamicQueryContext(C);      
    QueryProcessor processor = new QueryProcessor(SQC);
    Properties props=new Properties();
    try{   
        exp=processor.compileQuery(query);
        XMLStream=new File(xmlFileName);
        InputSource XMLSource=new InputSource(XMLStream.toURI().toString());
        SAXSource SAXs=new SAXSource(XMLSource); 
        DocumentInfo DI=SQC.buildDocument(SAXs);
        DQC.setContextNode(DI);

        SequenceIterator iter = exp.iterator(DQC);
        while(true){
            Item i = iter.next();
            if(i != null){
                System.out.println(i.getStringValue());
            }
            else break;
        }
    }
    catch (Exception e){
        System.err.println(e.getMessage());
    }
}   

这里有一个示例 XML 文件...

<?xml version="1.0"?>
<ns1:animal xmlns:ns1="http://my.catservice.org/">
    <cat>
        <catId>8889</catId>
        <fedStatus>true</fedStatus>
    </cat>
</ns1:animal>

如果我使用包含命名空间的查询运行此程序,则会收到错误消息。例如: /ns1:animal/cat/ 给出错误:“Prefix ns1 has not been declared”。

如果我从查询中删除 ns1:,它什么也没给我。如果我修改 xml 以删除“动物”前面的“ns1:”,我可以成功运行查询/animal/cat/

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: java xml sax saxon


    【解决方案1】:

    错误消息正确指出您的 xpath 表达式未指示名称空间前缀“ns1”的含义(绑定到)。仅仅因为要操作的文档碰巧使用了“ns1”的绑定并不意味着它就是应该使用的:这是因为在 XML 中,重要的是命名空间 URI,而前缀只是对真实事物的方便快捷方式。

    那么:你如何定义绑定?有2种通用方式;要么提供一个可以解析前缀的上下文,要么在 XPath 表达式中嵌入实际的 URI。

    关于第一种方法,来自撒克逊作者的this email 提到了 JAXP 方法 XPath.setNamespaceContext(),同样,Jaxen XPath processor FAQ 有一些示例代码可以提供帮助 这不是很方便,因为你必须实现 NamespaceContext,但是一旦你有一个实现,你就会被设置。

    所以符号方法......让我们看看:Top Ten Tips to Using XPath and XPointer 显示了这个例子:

    匹配使用命名空间声明的元素,例如:

    xmlns:book="http://my.example.org/namespaces/book"

    您使用 XPath 名称,例如:

    {http://my.example.org/namespaces/book}部分

    希望撒克逊人(或 Jaxen)能够理解。

    最后,如果您在使用上述任一解决方案时遇到任何问题,我建议您尽可能升级到 Saxon9。

    【讨论】:

      【解决方案2】:

      如果您想开箱即用,可以查看embedding-xquery-in-java。有一个 github 项目,它使用 Saxon 来评估一些示例 XQuery 表达式。

      问候

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-02
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 2014-10-13
        • 2017-07-30
        • 1970-01-01
        相关资源
        最近更新 更多