QDomDocument解析XML文件

本文档介绍如何在C++中通过QDomDocument库解析XML文件,详细讲解了主要步骤和关键代码,帮助读者理解XML文件的读取与解析过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

domparsexml.h
#ifndef DOMPARSEXML_H
#define DOMPARSEXML_H
 
#include <QWidget>
#include <QDomDocument>
#include <QFile>
#include <QTextStream>
 
namespace Ui {
class DomParseXML;
}
 
class DomParseXML : public QWidget
{
    Q_OBJECT
 
public:
    explicit DomParseXML(QWidget *parent = 0);
    ~DomParseXML();
 
public:
    int writeXML();
    int readXML();
 
private:
    QString fileName;
 
private:
    Ui::DomParseXML *ui;
};
 
#endif // DOMPARSEXML_H

domparsexml.cpp
#include "domparsexml.h"
#include "ui_domparsexml.h"
#include <QApplication>
#include <QMessageBox>
#include <QDebug>
 
DomParseXML::DomParseXML(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::DomParseXML)
{
    ui->setupUi(this);
    fileName = qApp->applicationDirPath() + "domparse.xml";
}
 
DomParseXML::~DomParseXML()
{
    delete ui;
}
 
int DomParseXML::writeXML()
{
    QFile file(fileName);
    if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        QMessageBox::information(NULL,"title","open error!");
        return -2;
    }
    QTextStream out(&file);
    QDomDocument doc;
    QDomText text;
    QDomElement element;
    QDomAttr attr;
    QDomProcessingInstruction instruction;
    instruction = doc.createProcessingInstruction("xml","version = \'1.0\' encoding=\'UTF-8\'");
    doc.appendChild(instruction);
 
    QDomElement root = doc.createElement("COMMAND");
    doc.appendChild(root);
    element = doc.createElement("OBJECT");
    text = doc.createTextNode("USER");
    element.appendChild(text);
    root.appendChild(element);
 
    element = doc.createElement("ACTION");
    text = doc.createTextNode("LOGIN");
    element.appendChild(text);
    root.appendChild(element);
 
    element = doc.createElement("DATA");
    root.appendChild(element);
 
    QDomElement userElement = doc.createElement("USER");
    attr = doc.createAttribute("NAME");
    attr.setValue("root");
    userElement.setAttributeNode(attr);
    attr = doc.createAttribute("PASSWORD");
    attr.setValue("123456");
    userElement.setAttributeNode(attr);
    element.appendChild(userElement);
 
    doc.save(out,4);
    return 0;
 
}
 
int DomParseXML::readXML()
{
    QDomDocument doc;
    QFile file(fileName);
    QString error = "";
    int row = 0,column = 0;
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "open error!";
        return -2;
    }
    if(!doc.setContent(&file,false,&error,&row,&column))
    {
        qDebug() << "parse file failed:" << row << "---" << column <<":" <<error;
        file.close();
        return -1;
    }
 
    file.close();
 
    QDomElement root = doc.documentElement();
    QDomNode node = root.firstChild();
    while(!node.isNull())
    {
        QDomElement element = node.toElement();
        if(!element.isNull())
        {
            qDebug() << element.tagName() << ":" << element.text();
            QDomNode nodeson = element.firstChild();
            while(!nodeson.isNull())
            {
                QDomElement elementson = nodeson.toElement();
                if(!elementson.isNull())
                {
                    qDebug()<< "---" <<elementson.tagName();
                    if(elementson.hasAttribute("NAME"))
                    {
                        qDebug()<< "---" << "NAME=" << elementson.attributeNode("NAME").value();
                    }
                    if(elementson.hasAttribute("PASSWORD"))
                    {
                        qDebug()<< "---" << "PASSWORD=" << elementson.attributeNode("PASSWORD").value();
                    }
                }
                nodeson = nodeson.nextSibling();
            }
        }
        node = node.nextSibling();
    }
 
    return 0;
}

main.cpp

#include "domparsexml.h"
#include <QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    DomParseXML w;
    w.writeXML();
    w.readXML();
 
    return a.exec();
}


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值