【问题标题】:How does one bind namespace prefixes when using QXmlQuery (Qt XQuery)?使用 QXmlQuery (Qt XQuery) 时如何绑定命名空间前缀?
【发布时间】:2011-02-16 01:25:08
【问题描述】:

我正在尝试使用 QXmlQuery 对具有声明的默认命名空间的文档执行 XQuery 表达式。

供讨论:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://namespace.com/ns1">
    <node1 attr1="hi"/>
</root>

现在,我有以下内容可以打开并查询文档:

QFile temp("my.xml");
temp.open(QIODevice::ReadOnly | QIODevice::Text);

QXmlQuery query;
query.setFocus(&temp);

QXmlResultItems items;
query.setQuery("/root");

query.evaluateTo(&items);

在运行它时,'items' 中永远不会有数据,因为文档是命名空间的。当然,如果我删除默认命名空间声明,'items' 确实有正确的数据,但我没有那么奢侈。

我尝试将查询更改为:“/prefix:root”,Qt 发出如下警告:

prefix:root 中的前缀前缀不存在命名空间绑定

所以命名空间绑定确实存在!但是哪里?我看到 QXmlNamePool,但它没有 mutator 方法。我可以使用查询 ala 中的池创建 QXmlName:

QXmlName name(query.namePool(), "prefix", "http://namespace.com/ns1");

但它不会改变任何东西。我很茫然,我用过的其他工具包有简单的方法来将前缀绑定到命名空间 URI。

【问题讨论】:

    标签: c++ qt xquery


    【解决方案1】:

    我相信如果您将查询更改为

    ...
    QXmlResultItems items;
    query.setQuery("declare default element namespace \"http://namespace.com/ns1\"; /root");
    ...
    

    它应该返回数据。

    希望这会有所帮助,问候

    【讨论】:

    • 行得通!这对于 Qt 来说绝对是可怕的 API,但它确实有效。谢谢!
    • @Nick Veys:这是XQuery 表达式,而不是 XPath。
    • @Alejandro: 那么有没有更好的类可以使用呢?它声称支持 XPath,因为它是 XQuery 的子集。
    • @Nick Veys:我会在任何 XPath 1.0 引擎上使用 XQuery/XPath 2.0
    • 我不能不同意,但是要求往往胜过偏好。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多