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();  
    }  
}  
相关推荐
敲敲敲敲暴你脑袋1 分钟前
写个添加注释的vscode插件
javascript·typescript·visual studio code
叁两30 分钟前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
golang学习记35 分钟前
GitLens 十大神技:彻底改变你在 VS Code 中的 Git 工作流
前端·后端·visual studio code
SuperEugene36 分钟前
后台权限与菜单渲染:基于路由和后端返回的几种实现方式
前端·javascript·vue.js
兆子龙39 分钟前
WebSocket 入门:是什么、有什么用、脚本能帮你做什么
前端·架构
csdn飘逸飘逸39 分钟前
Autojs基础-全局函数与变量(globals)
javascript
是一碗螺丝粉43 分钟前
LangChain 链(Chains)完全指南:从线性流程到智能路由
前端·langchain·aigc
KKKK1 小时前
手写Promise,从测试用例的角度理解
javascript
月弦笙音1 小时前
【浏览器】这几点必须懂
前端
青青家的小灰灰1 小时前
迈向全栈新时代:SSR/SSG 原理、Next.js 架构与 React Server Components (RSC) 实战
前端·javascript·react.js