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
相关产品推荐
相关产品推荐

