You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QDomElement::namespaceURI返回空字符串问题排查求助

问题:QDomElement::namespaceURI 未返回预期的XML命名空间

我在排查Qt库的问题时,发现对QDomElement::namespaceURI的工作原理或xmlns的作用机制存在误解,以下是最简隔离代码:

#include <iostream>
#include <QString>
#include <QDomDocument>

int main() {

    QString request = "<iq from='user2@example.org' id='disco1' to='user1@example.org' type='get'>";
    request +=          "<query node='someAddress' xmlns='http://jabber.org/protocol/disco#info'/>";
    request +=        "</iq>";
    QDomDocument doc;
    doc.setContent(request);
    QDomElement iq = doc.documentElement();
    QDomElement query = iq.firstChildElement();
    std::cout << query.tagName().toStdString() << " " << query.namespaceURI().toStdString() << std::endl;

    return 0;
}

编译命令:

g++ -o xmlTest xmlTest.cpp -lQt5Core -lQt5Xml -I /usr/include/qt -I /usr/include/qt/QtCore -I /usr/include/qt/QtXml

预期输出:query http://jabber.org/protocol/disco#info
实际输出:query


解决方法

问题出在Qt的QDomDocument::setContent默认关闭了命名空间解析功能,导致xmlns属性被当作普通属性处理,不会被识别为元素的命名空间,因此namespaceURI()返回空字符串。

只需要修改setContent调用,开启命名空间处理即可:

doc.setContent(request, true);

第二个参数namespaceProcessing设为true后,QDomDocument会正确解析XML中的命名空间,此时query.namespaceURI()就能返回预期的http://jabber.org/protocol/disco#info。

修改后的完整代码:

#include <iostream>
#include <QString>
#include <QDomDocument>

int main() {

    QString request = "<iq from='user2@example.org' id='disco1' to='user1@example.org' type='get'>";
    request +=          "<query node='someAddress' xmlns='http://jabber.org/protocol/disco#info'/>";
    request +=        "</iq>";
    QDomDocument doc;
    doc.setContent(request, true); // 开启命名空间处理
    QDomElement iq = doc.documentElement();
    QDomElement query = iq.firstChildElement();
    std::cout << query.tagName().toStdString() << " " << query.namespaceURI().toStdString() << std::endl;

    return 0;
}

重新编译运行后,就能得到预期的输出结果。


内容的提问来源于stack exchange,提问作者Blue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:01:35