QT加密解密读取XML文件

#-------------------------------------------------
#
# Project created by QtCreator 2018-03-16T23:59:22
#
#-------------------------------------------------

QT       += core gui xml

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = QtReadEncryptionXML
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        mainwindow.cpp

HEADERS += \
        mainwindow.h

FORMS += \
        mainwindow.ui
//
//  文件名:mainwindow.h
//  工程名:QtReadEncryptionXML
//  简介:Qt读取加密的XML文件   运行环境MacOS:10.13.1
//  创建日期:Created by chenyijun on 2018/03/16.
//  版权:Copyright © 2018年 chenyijun. All rights reserved.
//
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void initView();
    void initData();
    void initConnect();

public slots:
    void slotReadOriginalXML();
    void slotEncryptionXML();
    void slotReadEncryptXML();
    void slotDecryptionXML();

private:
    Ui::MainWindow *ui;
    QString m_strOrgXML;
    QString m_strEncryptXML;
    QString m_strDecryptXML;
};

#endif // MAINWINDOW_H
//
//  文件名:mainwindow.cpp
//  工程名:QtReadEncryptionXML
//  简介:Qt读取加密的XML文件   运行环境MacOS:10.13.1
//  创建日期:Created by chenyijun on 2018/03/16.
//  版权:Copyright © 2018年 chenyijun. All rights reserved.
//


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QFile>
#include <QMessageBox>
#include <QDomDocument>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    initView();
    initData();
    initConnect();

}

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


void MainWindow::initView()
{

}

void MainWindow::initData()
{
    m_strOrgXML = "/Users/chenyijun/project/QtReadEncryptionXML/test_org.xml";
    m_strEncryptXML = "/Users/chenyijun/project/QtReadEncryptionXML/test_encrypt.xml";
    m_strDecryptXML = "/Users/chenyijun/project/QtReadEncryptionXML/test_decrypt.xml";
}

void MainWindow::initConnect()
{
    connect(ui->pushButton_ReadXML, SIGNAL(clicked()), this, SLOT(slotReadOriginalXML()));
    connect(ui->pushButton_ReadEncryption, SIGNAL(clicked()), this, SLOT(slotReadEncryptXML()));
    connect(ui->pushButton_Encryption, SIGNAL(clicked()), this, SLOT(slotEncryptionXML()));
    connect(ui->pushButton_Decryption, SIGNAL(clicked()), this, SLOT(slotDecryptionXML()));
}

void MainWindow::slotReadOriginalXML()
{
    QFile file(m_strOrgXML);
    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为root
    QString rootTagName = root.tagName();
    qDebug() << "rootTagName====================" << rootTagName;
    //获取第一级子节点,数目为2   分别为persons(4个节点)和index(3个节点)
    QDomNodeList mainList = root.childNodes();
    int mainListCount = mainList.count();
    qDebug() << "mainListCount====================" << mainListCount;
    for(int i1 = 0; i1 < mainListCount; ++i1)
    {
        QDomNode dom_node = mainList.item(i1);
        QDomElement element = dom_node.toElement();
        //获取name值,等价
        QString name_1 = element.attributeNode("name").value();
        QString name_2 = element.attribute("name");
        //qDebug() << "i1====" << i1 << "   name_1===" << name_1 << "    name_2===" << name_2 << "    element.tagName===" << element.tagName() << "    element.text==" << element.text();
        QDomNodeList m2list = element.childNodes();
        int m2listCount = m2list.count();
        for(int i2 = 0; i2 < m2listCount; ++i2)
        {
            QDomNode dom_node = m2list.item(i2);
            //读取子元素 方式1与方式2等价
            QDomElement element = dom_node.toElement();
            //qDebug() << "i2====" << i2  << "    element.tagName===" << element.tagName() << "    element.text==" << element.text();
            QDomNodeList child_list = element.childNodes();
            int child_listCount = child_list.count();
            for(int i3 = 0; i3 < child_listCount; ++i3)
            {
                QDomNode dom_node = child_list.item(i3);
                QDomElement element = dom_node.toElement();
                qDebug() << "i3" << i3 << "    element.tagName===" << element.tagName() << "    element.text==" << element.text();

            }
            //读取子元素方式2
//            QDomElement element = dom_node.firstChildElement();
//            while(!element.isNull())
//            {
//                   QString tag_name = element.tagName();
//                   QString tag_value = element.text();
//                   qDebug() << "tag_name===" << tag_name << "    tag_value==" << tag_value;
//                  element = element.nextSiblingElement();
//            }
            qDebug() << "\n";
        }
        qDebug() << "\n\n";
    }

}

void MainWindow::slotReadEncryptXML()
{
    QFile file(m_strEncryptXML);
    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;
    //解密
    QByteArray byteArray = QByteArray::fromBase64(file.readAll());
    //if(!document.setContent(&file, false, &error, &row, &column))
    if(!document.setContent(byteArray, 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为root
    QString rootTagName = root.tagName();
    qDebug() << "rootTagName====================" << rootTagName;
    //获取第一级子节点,数目为2   分别为persons(4个节点)和index(3个节点)
    QDomNodeList mainList = root.childNodes();
    int mainListCount = mainList.count();
    qDebug() << "mainListCount====================" << mainListCount;
    for(int i1 = 0; i1 < mainListCount; ++i1)
    {
        QDomNode dom_node = mainList.item(i1);
        QDomElement element = dom_node.toElement();
        //获取name值,等价
        QString name_1 = element.attributeNode("name").value();
        QString name_2 = element.attribute("name");
        //qDebug() << "i1====" << i1 << "   name_1===" << name_1 << "    name_2===" << name_2 << "    element.tagName===" << element.tagName() << "    element.text==" << element.text();
        QDomNodeList m2list = element.childNodes();
        int m2listCount = m2list.count();
        for(int i2 = 0; i2 < m2listCount; ++i2)
        {
            QDomNode dom_node = m2list.item(i2);
            //读取子元素 方式1与方式2等价
//            QDomElement element = dom_node.toElement();
//            //qDebug() << "i2====" << i2  << "    element.tagName===" << element.tagName() << "    element.text==" << element.text();
//            QDomNodeList child_list = element.childNodes();
//            int child_listCount = child_list.count();
//            for(int i3 = 0; i3 < child_listCount; ++i3)
//            {
//                QDomNode dom_node = child_list.item(i3);
//                QDomElement element = dom_node.toElement();
//                qDebug() << "i3" << i3 << "    element.tagName===" << element.tagName() << "    element.text==" << element.text();

//            }
            //读取子元素方式2
            QDomElement element = dom_node.firstChildElement();
            while(!element.isNull())
            {
                   QString tag_name = element.tagName();
                   QString tag_value = element.text();
                   qDebug() << "tag_name===" << tag_name << "    tag_value==" << tag_value;
                  element = element.nextSiblingElement();
            }
            qDebug() << "\n";
        }
        qDebug() << "\n\n";
    }

}


void MainWindow::slotEncryptionXML()
{
    //QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QFile originalFile(m_strOrgXML);
    if(!originalFile.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(0, "Read Tip", "Read original File error!", QMessageBox::Yes);
    }
    //加密
    QByteArray byteArray = originalFile.readAll().toBase64();
    byteArray = byteArray.insert(10, "yijun");//加入一些特殊字符,解密的时候必须按规则解密,否则就算知道是Base64加密的也解密不了.
    qDebug() << "Encrypt======byteArray======" << byteArray;
    QFile encryptFile(m_strEncryptXML);
    if(!encryptFile.open(QIODevice::WriteOnly))
    {
        QMessageBox::warning(0, "Write Tip", "encrypt error!", QMessageBox::Yes);
    }
    encryptFile.write(byteArray);
    originalFile.close();
    encryptFile.close();
}

void MainWindow::slotDecryptionXML()
{
    QFile file(m_strEncryptXML);
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(this, tr("Load Encrypt File"), file.errorString(), QMessageBox::Yes);
    }
    //解密
    QByteArray byteArray = file.readAll();
    byteArray = byteArray.remove(10, 5);//按加密规则解密
    byteArray = QByteArray::fromBase64(byteArray);

    qDebug() << "Decrypt=====byteArray======" << byteArray;
    QFile decryptFile(m_strDecryptXML);
    if(!decryptFile.open(QIODevice::WriteOnly))
    {
        QMessageBox::warning(0, "Write Tip", "decrypt error!", QMessageBox::Yes);
    }
    decryptFile.write(byteArray);
    file.close();
    decryptFile.close();

}
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}


test_org.xml文件内容
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root>
    <persons name = "Qt">
        <person id = "101">
            <name>baidu</name>
            <age>1999</age>
            <website>https://www.baidu.com/</website>
        </person>
        <person id = "102">
            <name>sohu</name>
            <age>1998</age>
            <website>http://www.sohu.com/</website>
        </person>
        <person id = "103">
            <name>qq</name>
            <age>1998</age>
            <website>http://www.qq.com/</website>
        </person>
        <person id = "104">
            <name>youku</name>
            <age>2006</age>
            <website>http://www.youku.com/</website>
        </person>
    </persons>
    <index>
        <item>
            <id>10001</id>
            <title>number1</title>
            <text>this is number1</text>
        </item>
        <item>
            <id>10002</id>
            <title>number2</title>
            <text>this is number2</text>
        </item>
        <item>
            <id>10003</id>
            <title>number3</title>
            <text>this is number3</text>
        </item>
    </index>
</root>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值