QDomDocument Xml配置文件读写

这篇具有很好参考价值的文章主要介绍了QDomDocument Xml配置文件读写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

用Qt中QDomDocument读写Xml格式配置文件,使用时.pro文件中需加

QT       += xml

xml格式文件

<manifest package="net.sunniwell.contentprovider" android:versionCode="1" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0">
    <uses-sdk android:targetSdkVersion="21" android:minSdkVersion="8"/>
    <application android:allowBackup="true" android:label="@string/app_name" android:theme="@style/AppTheme" android:icon="@drawable/ic_launcher">
        <activity android:name="net.sunniwell.contentprovider.test.ui.SWMainActivity">
            <intent-filter>
                <action android:name="net.sunniwell.contentprovider.UI"/>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name="net.sunniwell.contentprovider.test.ui.SWContactActivity">
            <category android:name="android.intent.category.DEFAULT"/>
        </activity>
        <provider android:name="net.sunniwell.contentprovider.test.SWContentProvider" android:exported="true" android:authorities="net.sunniwell.provider.stb"/>
    </application>
</manifest>

读取xml常用方法

    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly)){
        QMessageBox::warning(nullptr,"提示","文件打开失败!");
        return;
    }

    QDomDocument doc;//doc
    QString error;
    int row = 0,column = 0 ;
    if(!doc.setContent(&file,false,&error,&row,&column)){
        QMessageBox::warning(nullptr,"提示","读取xml格式失败!");
        return;
    }
    
    QDomElement hRoot = doc.documentElement();//获取根节点
    
    QDomNamedNodeMap map = hRoot.attributes();//获取节点中的属性值
    for (int j=0; j< map.length(); j++) {
        itemTmp->setText(0,map.item(j).nodeName());//获取节点属性名
        itemTmp->setText(1,map.item(j).nodeValue());//获取节点属性值
    }
    
 	QDomNodeList ItemArray = hRoot.childNodes();//获取子节点
    for (int i = 0; i<ItemArray.length(); i++) {
        QDomElement element = ItemArray.item(i).toElement();//转换为QDomElement获取子节点 
        //...
 		//QDomNodeList ItemArray = element .childNodes();//获取子节点
   		//QDomNamedNodeMap map = element .attributes();//获取节点中的属性值
   		//...
    }
    if(hRoot.hasAttribute("name"))//判断是否存在该属性
		QString str = hRoot.attribute("name");//根据属性名获取属性值

获取指定节点属性值


    //获取指定节点属性值
    QFile file(fileName);
    if(file.open(QIODevice::ReadOnly)){
        QDomDocument doc;//doc
        if(doc.setContent(&file)){
            QDomElement hRoot = doc.documentElement();//获取根节点
            QDomNode n = hRoot.firstChild();//获取第一个子节点
            while(!n.isNull()){
                QDomElement e=n.toElement();
                if(e.nodeName() == "nodeName"){//根据节点名判断
                    QString value = e.attribute("value");//获取节点中value属性值
                    break;
                }
                n = n.nextSibling();//获取下一个兄弟节点
            }
        }
        file.close();
    }

保存xml常用方法


    QFile file(fileName);
    if(!file.open(QIODevice::WriteOnly)){
        QMessageBox::warning(nullptr,"提示","文件打开失败!");
        return;
    }

    QDomDocument doc;

   QDomElement node = doc.createElement("name");//创建节点名
   doc.appendChild(node);//添加到根节点
	
   QDomElement node_1 = doc.createElement("name");//创建节点名
   node.appendChild(node_1 );//添加到node节点
   node_1.setAttribute("name","value");//添加设置属性名,属性值
   
   QTextStream stream(&file);
   doc.save(stream, 4);//保存到文件
   file.close();

示例图

qdomelement读取属性值,qt,xml,ui,qt

示例源码

.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTreeWidget>
#include <QDomDocument>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void Read(QDomElement node, QTreeWidgetItem* item);
    void Save(QString fileName);
    void GetData(QDomDocument doc, QDomElement node, QTreeWidgetItem* item);
private slots:
    void OnOpen();
    void OnSave();
    void OnSaveAs();
private:
    Ui::MainWindow *ui;

    QTreeWidget* m_treeWidget;
    QString m_currentFileName;
};
#endif // MAINWINDOW_H

.cpp文件文章来源地址https://www.toymoban.com/news/detail-699933.html

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFile>
#include <QLayout>
#include <QPushButton>
#include <QFileDialog>
#include <QMessageBox>
#include <QDebug>
#include <QHeaderView>
#include <QStyleFactory>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("XML编辑");
    QWidget* widget = new QWidget;
    m_treeWidget = new QTreeWidget;
    m_treeWidget->setStyle(QStyleFactory::create("windows"));//显示节点虚线 - +
    m_treeWidget->setColumnWidth(0, 400);//设置第0列列宽
    //m_treeWidget->header()->setSectionResizeMode(QHeaderView::Stretch);//设置列宽自动分均
    m_treeWidget->setColumnCount(2);
    QStringList headList;
    headList << "node" <<"value";
    m_treeWidget->setHeaderLabels(headList);//设置表头

    QHBoxLayout* hbox = new QHBoxLayout;
    QVBoxLayout* vbox = new QVBoxLayout;
    QPushButton* btnOpen = new QPushButton("Open");
    QPushButton* btnSave = new QPushButton("Save");
    QPushButton* btnSaveAs = new QPushButton("Save As");
    connect(btnOpen,&QPushButton::clicked, this, &MainWindow::OnOpen);
    connect(btnSave,&QPushButton::clicked, this, &MainWindow::OnSave);
    connect(btnSaveAs,&QPushButton::clicked, this, &MainWindow::OnSaveAs);
    hbox->addWidget(btnOpen);
    hbox->addWidget(btnSave);
    hbox->addWidget(btnSaveAs);
    hbox->addStretch();
    vbox->addLayout(hbox);
    vbox->addWidget(m_treeWidget);
    widget->setLayout(vbox);
    setCentralWidget(widget);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::Read(QDomElement node,  QTreeWidgetItem* item)
{
    item->setFlags(item->flags() | Qt::ItemIsEditable);
    item->setText(0,node.tagName());
    if(node.childNodes().length() <=1 )
        item->setText(1, node.text());
    QDomNamedNodeMap map = node.attributes();
    for (int j=0; j< map.length(); j++) {
        QTreeWidgetItem* itemTmp = new QTreeWidgetItem;
        item->addChild(itemTmp);
        itemTmp->setFlags(itemTmp->flags() | Qt::ItemIsEditable);
        itemTmp->setText(0,map.item(j).nodeName());
        itemTmp->setText(1,map.item(j).nodeValue());
    }

    QDomNodeList ItemArray = node.childNodes();
    for (int i = 0; i<ItemArray.length(); i++) {
        QDomElement element = ItemArray.item(i).toElement();
        if(element.tagName() != ""){
            QTreeWidgetItem* itemTmp = new QTreeWidgetItem;
            item->addChild(itemTmp);
            Read(element,itemTmp);
        }
    }
}

void MainWindow::GetData(QDomDocument doc, QDomElement node, QTreeWidgetItem *item)
{
    for (int i=0; i<item->childCount(); i++) {
         if(item->child(i)->childCount() == 0){
             node.setAttribute(item->child(i)->text(0),item->child(i)->text(1));
         }else{
             QDomElement nodeTmp = doc.createElement(item->child(i)->text(0));
             node.appendChild(nodeTmp);
             GetData(doc, nodeTmp, item->child(i));
         }
    }
}

void MainWindow::Save(QString fileName)
{
    QFile file(fileName);
    if(!file.open(QIODevice::WriteOnly)){
        QMessageBox::warning(nullptr,"提示","文件打开失败!");
        return;
    }

    QDomDocument doc;

    for (int i=0; i<m_treeWidget->topLevelItemCount(); i++) {
        QDomElement node = doc.createElement(m_treeWidget->topLevelItem(i)->text(0));
        doc.appendChild(node);
        GetData(doc, node, m_treeWidget->topLevelItem(i));
    }

    QTextStream stream(&file);
    doc.save(stream, 4);
    file.close();

    QMessageBox::information(nullptr,"提示","保存成功!");
}

void MainWindow::OnOpen()
{
    m_treeWidget->clear();
    QString fileName = QFileDialog::getOpenFileName(nullptr,"选择文件","/","*.xml");
    if(fileName.isEmpty()){
        QMessageBox::warning(nullptr,"提示","选择文件为空!");
        return;
    }

    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly)){
        QMessageBox::warning(nullptr,"提示","文件打开失败!");
        return;
    }

    QDomDocument doc;
    QString error;
    int row = 0,column = 0 ;
    if(!doc.setContent(&file,false,&error,&row,&column)){
        QMessageBox::warning(nullptr,"提示","读取xml格式失败!");
        return;
    }

    QTreeWidgetItem* item = new QTreeWidgetItem;
    m_treeWidget->addTopLevelItem(item);
    QDomElement hRoot = doc.documentElement();
    Read(hRoot, item);

    file.close();
    m_currentFileName = fileName;
}

void MainWindow::OnSave()
{
    if(m_currentFileName.isNull()){
        QMessageBox::warning(nullptr,"提示","未打开文件!");
        return;
    }

    Save(m_currentFileName);
}

void MainWindow::OnSaveAs()
{
    if(m_treeWidget->currentItem() == 0){
        QMessageBox::warning(nullptr,"提示","未打开文件!");
        return;
    }

    QString fileName = QFileDialog::getSaveFileName(nullptr,"选择文件","/","*.xml");
    if(fileName.isEmpty()){
        QMessageBox::warning(nullptr,"提示","选择文件为空!");
        return;
    }
    Save(fileName);

}


到了这里,关于QDomDocument Xml配置文件读写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET配置文件大揭秘:轻松读取JSON、XML、INI和环境变量

      概述: .NET中的IConfiguration接口提供了一种多源读取配置信息的灵活机制,包括JSON、XML、INI文件和环境变量。通过示例,清晰演示了从这些不同源中读取配置的方法,使配置获取变得方便且易于扩展。这种方式适用于不同场景,如API密钥、数据库连接等,为应用提供了高度

    2024年02月20日
    浏览(39)
  • 【Python--XML文件读写】XML文件读写详解

    1.1 介绍 XML 指可扩展标记语言XML ,常被设计用来传输和存储数据。 XML 是一种固有的分层数据格式,最自然的表示方式是使用树。 ET为此有两个类 - ElementTree将整个 XML 文档表示为一棵树,并 Element表示该树中的单个节点。与整个文档的交互(从文件读取和写入/从文件写入)通

    2024年02月04日
    浏览(41)
  • qt读写xml文件

    Qt使用XML模块,在.pro文件中添加 QT += xml Qt 提供了三种读 写  XML 文档的方法: QXmlStreamReader / QXmlStreamWriter: 一种快速的基于流的方式访问良格式 XML 文档 , 特别适合于实现一次解析器(所谓“一次解析器”,可以理解成我们只需读取文档一次,然后像一个遍历器从头到尾一

    2024年02月11日
    浏览(44)
  • Unity中的文件读写TXT 与XML

    在游戏开发中,有的单机游戏会用到保存数据到本地,或者根据本地的数据来进行下次的设置。这里,鄙人介绍TXT与xml 的读写。 首先是txt: 新建一个unity工程,创建一个cube,新建一个脚本:CreatTxt挂载到cube上。然后打开脚本。输入一下的代码: 然后保存运行: 运行后的截

    2024年02月04日
    浏览(44)
  • Java读取XML文件

    XML声明是XML文档的第一句,其格式如下 良好的XML文档必须只有一个根元素,就是紧接这声明后面接着的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。 在XML文档中,大小写是有区别的。\\\"A\\\"和\\\"a\\\"是不同的标记。 所有标记必须成对出现

    2024年02月08日
    浏览(58)
  • Java读取XML文本文件

    圆周率没有尽头,风景一直在路上 编写测试的xml文本文件 编码读取(可根据自己需求改写读取节点)

    2024年02月16日
    浏览(72)
  • qt xml文件写入读取

    ****************************************************************************** QT       += core gui xml ****************************************************************************** #include \\\"mainwindow.h\\\" #include QDomDocument #include QTextStream #include QFile #include QDebug MainWindow::MainWindow(QWidget *parent)     : QMainWindow(parent) {    

    2024年02月09日
    浏览(42)
  • Pyspark读写csv,txt,json,xlsx,xml,avro等文件

    读: 读: 写: 读: 写: 读: 写: 读: 写: 读: 写: 读: 写: 读: 写: 读: 写:

    2024年02月07日
    浏览(44)
  • C# XML文件(相机参数保存和读取)

    XML是可扩展标记语言(Extensible Markup Language,XML)是一种数据语言,它将数据以一种简单的文本格式存储,可以被人类和几乎任何计算机理解。Microsoft在.Net Framework和其他微软产品中已经完全采用它。 XML的基本格式: C#操作XML方法详解 创建一个相机参数XML文件保存和读取的类

    2024年02月12日
    浏览(49)
  • XML的基础知识及XMl文件的创建/读取/更新demo详解

    1.什么是xml? Xml(Extensible Markup Language),可扩展标记语言,一种用于存储数据或传输数据的标记语言,由万维网(W3C开发)。它允许开发人员创建自己的标记,且简单易读,易扩展,支持标准的字符编码,如UFT-8,UTF-16. 2. Xml文档的基本结构 2.1文档声明 ,包括文档版本(ver

    2024年04月09日
    浏览(86)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包