动态xml操作

9 篇文章 0 订阅
2 篇文章 0 订阅

xml工具类头文件

#ifndef XMLTOOL_H
#define XMLTOOL_H

#include <QObject>
#include "pugixml.hpp"
#include <iostream>
#include <QList>


using namespace pugi;
using namespace  std;

class XmlTool:public QObject{
  Q_OBJECT
public:
    static xml_document* loadXmlDocument(const QString& filePath);

    static bool saveXmlDocument(const QString& filePath, xml_document* doc);

    static xml_node getNode(xml_document* doc, const QString& xpath);

    static xml_node appendNode(xml_node* parent, const QString& name);

    static bool setNodeText(xml_node* node, const QString& text);

    static QString getNodeText(xml_node* node);

    static bool deleteNode(xml_node* node);

    static void freeXmlDocument(xml_document* doc);
    /**
     * @brief docFrameX
     * @param filePath
     * @param targetPath
     */
    static void docFrameX(const QString filePath,const QString targetPath);
    /**
     *
     * @brief getAllNodesX
     * @param root
     */
    static void getAllNodesX(xml_node root);
    /**
     *
     * @brief handleDomNode
     * @param node
     * @param list
     */
    static void handleDomNode(xml_node node,QList<xml_node>* list);
};
#endif // XMLTOOL_H


xml工具类Cpp

#include "XmlTool.h"
#include <QDir>

xml_document* XmlTool::loadXmlDocument(const QString& filePath) {
    auto doc = new xml_document();
    xml_parse_result result = doc->load_file(QDir::toNativeSeparators(filePath).toStdString().c_str());
    if (result.status != status_ok) {
        delete doc;
        return nullptr;
    }
    return doc;
}

bool XmlTool::saveXmlDocument(const QString& filePath, xml_document* doc) {
    return doc->save_file(filePath.toStdString().c_str());
}

xml_node XmlTool::getNode(xml_document* doc, const QString& xpath) {
    auto result = doc->select_node(xpath.toStdString().c_str());
    if (result) {
        return result.node();
    }
    return xml_node();
}

xml_node XmlTool::appendNode(xml_node* parent, const QString& name) {
    return parent->append_child(name.toStdString().c_str());
}

bool XmlTool::setNodeText(xml_node* node, const QString& text) {
    if (node) {
        node->text().set(text.toStdString().c_str());
        return true;
    }
    return false;
}

QString XmlTool::getNodeText(xml_node* node) {
    if (node)
        return QString::fromStdString(node->text().as_string());
    return QString();
}

bool XmlTool::deleteNode(xml_node* node) {
    if (node && node->parent()) {
        xml_node parent = node->parent();
        parent.remove_child(*node);
        delete node;
        return true;
    }
    return false;
}

void XmlTool::freeXmlDocument(xml_document* doc) {
    if (doc)
        delete doc;
}

void XmlTool::docFrameX(const QString filePath, const QString targetPath)
{
    xml_document* doc = loadXmlDocument(filePath);
    if(doc){
        getAllNodesX(doc->root());
        saveXmlDocument(targetPath,doc);
    }
}

void XmlTool::getAllNodesX(xml_node root)
{
    for(xml_node node = root.first_child(); node; node = node.next_sibling()) {
        const QString tagName =node.name();
        cout<<"tagName============"<<tagName.toStdString()<<endl;
        if(tagName=="DOM1"){
            QList<xml_node> list;
            handleDomNode(node,&list);
           xml_node previousNode = node.previous_sibling();
            for(xml_node childNode:list){
                if(!previousNode.empty()){
                    root.insert_copy_after(childNode,previousNode);
                }else{
                    root.append_copy(childNode);
                }
            }
            root.remove_child(node);
            getAllNodesX(root);
        }
        getAllNodesX(node);
    }
}

void XmlTool::handleDomNode(xml_node node, QList<xml_node> *list)
{
    QString type = node.attribute("type").value();
    if(type=="for"){
        QString forCountStrRoot = node.attribute("forCount").value();
        int forCountRoot = forCountStrRoot.toInt();
        for(int index=0;index<forCountRoot;index++){
            for(xml_node nodeC = node.first_child(); nodeC; nodeC = nodeC.next_sibling()) {
                list->append(nodeC);
            }
        }
    }
}

主函数

#include <QApplication>
#include "XmlTool.h"
#include <QDateTime>

int main(int argc, char *argv[])
{

    qRegisterMetaType<QList<xml_node>>("QList<xml_node>");
    Q_UNUSED(argc);
    Q_UNUSED(argv);
    QString xmlPath = "C:\\Users\\tirkl\\Test.xml";
    QString d = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
    QString xmlPathX = "C:\\Users\\tirkl\\"+d+".xml";
    XmlTool::docFrameX(xmlPath,xmlPathX);
    return 0;
}

测试xml

<DocFrame>
        <Data  id="1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
        <DOM1 type="for" forCount="2">
                <Data  id="1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"> 
                        <DOM1 type="for" forCount="2">
                                <Data  id="1.1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" pid="1">
                                        <DOM1 type="for" forCount="2">
                                                <Data  id="1.1.1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" pid="1.1"/>
                                        </DOM1>
                                </Data> 
                        </DOM1>
                </Data>
        </DOM1>
        <Data  id="1" name="jask" age="12" email="xxxx@hout.com" remark="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"/>
</DocFrame>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追Star仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值