Saxon 8(Java版)问题

时间:2009-05-11 15:01:13

标签: java xml sax 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/给出错误:“前缀ns1尚未声明”。

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

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

匹配使用名称空间声明的元素:

的xmlns:书= “http://my.example.org/namespaces/book”

您使用XPath名称,如:

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

希望Saxon(或Jaxen)理解

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

答案 1 :(得分:0)

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

此致