有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

xml Saxon 8(Java版本)问题

我现在要指出的是,我对使用saxon还不熟悉,我已经尝试了遵循软件包中的文档和示例,但我只是在这个问题上运气不好

基本上,我正在尝试使用SaxonV8在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以删除“animal”前面的“ns1:”,我可以成功地运行查询/animal/cat/

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


共 (2) 个答案

  1. # 1 楼答案

    如果你想让一些东西开箱即用,你可以查看embedding-xquery-in-java。还有一个github项目,它使用Saxon计算一些示例XQuery表达式

    问候

  2. # 2 楼答案

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

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

    关于第一种方法,Saxon作者提到了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}节

    希望萨克森(或杰克森)能理解这一点

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