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();  
    }  
}  
相关推荐
橙子家7 小时前
浏览器缓存之【基础键值存储】:Local storage 和 Session storage
前端
星星在线9 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒10 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x10 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者11 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端
袋鱼不重12 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
竹林81812 小时前
Web3表单签名验证:我用 wagmi 和 ethers 给 DApp 加了一个“免密登录”,踩坑记录全在这了
javascript
用户69903048487512 小时前
try catch使用场景 处理同步代码错误兼容用的
javascript·uni-app
雪碧聊技术12 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
Fireworks12 小时前
深入vue3源码解读 -- 1、响应式的基础概念
前端