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();  
    }  
}  
相关推荐
熊猫钓鱼>_>8 分钟前
Electron:当 Web 技术统治桌面
大数据·前端·javascript·人工智能·架构·electron·agent
德福危险10 分钟前
从盲打xss到到模板注入:unix靶机渗透之Tempus_fugit4
前端·unix·xss
JavaGuide12 分钟前
又一个画图 Skill 开源,再见手动画 draw.io!
前端·后端·github
一只猫的梦44 分钟前
AI 适配器架构
前端·chrome
江华森1 小时前
Python 实现高德地图找房(三):地图可视化与高德 JS API
开发语言·javascript·python
谭光志1 小时前
AI 是怎么操作浏览器的——browser use 实现原理
前端·javascript·ai编程
weixin_471383031 小时前
args,...args与Parameters<T>
开发语言·前端
用户3074596982071 小时前
GatewayWorker 从零到一完整指南
javascript·php
铁皮饭盒1 小时前
Bun.redis真正的强项
javascript
用户938515635071 小时前
Node.js 路径与文件系统:从基础到异步进化之路
javascript·后端·面试