java - Saxon 8(Java版)问题

标签 java xml sax saxon

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

基本上,我正在尝试使用 saxon v8 在 java 中进行一些 xml 处理。为了让某些东西工作,我使用了包中包含的示例文件之一并根据我的需要进行了修改。只要我不使用 namespace ,它就可以工作,这是我的问题。我怎样才能解决 namespace 问题?我不太关心使用它,但它存在于我的 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/

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

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

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

关于第一种方法,this email 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 }部分

希望 Saxon(或 Jaxen)能够理解。

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

关于java - Saxon 8(Java版)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/848535/

相关文章:

java - 使用 SAX 解析器遍历 xml 文档并以所需格式打印输出

Java 创建一个新的 xml 文件并附加它

java - 按命名空间属性选择的 XPathExpression 不选择任何内容

java - 如果输入文件中未指定 DTD,我如何强制 SAX 解析器使用 DTD?

java - 获得独特的正则表达式匹配器结果(不使用 map 或列表)

java - SearchView中的onQueryTextSubmit在Android Java中被处理了两次

java - 绘制动态图

java - Spring 4 Websocket - 没有任何反应

java - 如何比较两个 HashMap<String, List<String>> 以列表项作为值,以检查 hMap1 中的值是否存在于 hMap2 中

javascript - 简单的 XML HttpRequest 问题