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);
static void docFrameX(const QString filePath,const QString targetPath);
static void getAllNodesX(xml_node root);
static void handleDomNode(xml_node node,QList<xml_node>* list);
};
#endif
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>