Qt XML文件解析 QDomDocument

QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢?

DOM(Document Object Model):将XML文件保存为树的形式,操作简单,便于访问。

SAX(Simple API for XML):接近于底层,速度较快,但不便于访问。

如果要使用XML时,.pro文件中添加:

cpp 复制代码
QT += xml

使用时添加文件头:

cpp 复制代码
#include <QDomDocument>

QXmlStreamReader和QXmlStreamWriter不在模块QtXml中,而是在QtCore中,该模块只涉及DOM和SAX基于XML的接口。

cpp 复制代码
解析方法:
void ParseXML::parse(QString file_name)  
{  
    if(file_name.isEmpty())  
       return;  
  
    QFile file(file_name);  
   if(!file.open(QFile::ReadOnly | QFile::Text))
    {  
       QMessageBox::information(NULL, QString("title"), QString("open error!"));

       return;  
    }  
  
    QDomDocument document;  
    QString error;  
    int row = 0, column = 0;  
   if(!document.setContent(&file, false, &error, &row, &column))
    {  
       QMessageBox::information(NULL, QString("title"), QString("parse file failed at line row and column") + QString::number(row, 10) + QString(",") + QString::number(column, 10));

       return;  
    }  
  
   if(document.isNull())
    {  
       QMessageBox::information(NULL, QString("title"), QString("document is null!"));
       
       return;  
    }  
  
    QDomElement root = document.documentElement();  

   //root_tag_name为persons
    QString root_tag_name = root.tagName();
   if(root.hasAttribute("name"))
    {
       //name为Qt
       QString name = root.attributeNode("name").value(); 
    }
      
    //获取id="1"的节点
    QDomElement person = root.firstChildElement();  
   if(person.isNull()) 
       return; 

    QString person_tag_name = person.tagName();

    //id为1
    QString id = person.attributeNode("id").value();

    //获取子节点,数目为2
    QDomNodeList list = root.childNodes();
    int count = list.count();
    for(int i=0; i
    {
       QDomNode dom_node = list.item(i);
       QDomElement element = dom_node.toElement();

       //获取id值,等价
       QString id_1 = element.attributeNode("id").value(); 
       QString id_2 = element.attribute("id");

       //获取子节点,数目为4,包括:name、age、email、website
       QDomNodeList child_list = element.childNodes();
       int child_count = child_list.count();
       for(int j=0; j
       {
           QDomNode child_dom_node = child_list.item(j);
          QDomElement child_element = child_dom_node.toElement();
           QString child_tag_name = child_element.tagName();
           QString child__tag_value = child_element.text();
       }
    }

   //按照name、age、email、website的顺序获取值
    QDomElement element = person.firstChildElement();  
   while(!element.isNull())
    {  
       QString tag_name = element.tagName();
       QString tag_value = element.text();
       element = element.nextSiblingElement();  
    }  
}  
相关推荐
SamChan9010 小时前
在Web应用中集成PDF多语言翻译功能:PDFTranslator API实战指南
前端·python·ai·pdf·yapi·机器翻译
kyriewen10 小时前
AI Agent 9秒删光了生产数据库——我给自己的项目做了5个紧急检查
前端·ai编程·claude
IT_陈寒11 小时前
JavaScript的this又双叒叕让我怀疑人生了
前端·人工智能·后端
陈随易11 小时前
MCP协议第5次更新,从打电话到微信聊天的巨大变革
前端·后端·程序员
omnijk11 小时前
前端工程化
前端
做前端的娜娜子11 小时前
前端必看!我把一段"能跑不敢动"的报表代码用 AI 重构成了组件(附完整 Prompt)
前端·ai编程
柚yuzumi11 小时前
变量明明定义了,为什么访问不到?深入理解 JavaScript 作用域
javascript
hunterandroid11 小时前
[鸿蒙从零到一] ArkUI 动画与转场实战:状态驱动、组件过渡与页面衔接
前端
何时梦醒11 小时前
React + TypeScript + Vite 实战:从零构建 Color Picker 应用
前端·javascript·架构