39XML文档类

Posted gd-luojialin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了39XML文档类相关的知识,希望对你有一定的参考价值。

技术分享图片

 

Xml源代码

domxml.h

#ifndef DOMXML_H

#define DOMXML_H

#include <QString>

#include <QStringList>

#include <QDomDocument> //文件

#include <QDomProcessingInstruction>    //头部

#include <QDomElement>  //元素

#include <QDomText>

 

class DomXML

{

public:

    DomXML();

    //创建空的XML

    static void CreateXML(QString strFilePath);

    //搭建XML结构

    static void AppendXML(QString strFilePath,QStringList list);

    //写XML

    static void WriteXML(QDomDocument &doc,QDomElement &root,QStringList list);

    //写XML

    static void ReadXML(QString strFilePath,

                         QStringList &fList,

                         QStringList &bList,

                         QStringList &pList,

                         QStringList &nList,

                         QStringList &tList

                         );

 

 

};

 

#endif // DOMXML_H

 

 

domxml.cpp

#include "domxml.h"

#include <QFile>

#include <QTextStream>

#include <QDateTime>

#include <QDebug>

#define cout qDebug()<<"["<<__FILE__<<":"<<__LINE__<<"]"

 

 

DomXML::DomXML()

{

}

 

//创建空的xml文件

void DomXML::CreateXML(QString strFilePath)

{

    //打开文件

    QFile file(strFilePath);

    if(file.exists())

    {

        cout<<"FilePath exists";

        return ;

    }

    else

    {

        bool bIsOk=file.open(QIODevice::WriteOnly);

        if(bIsOk)

        {//打开文件成功

            //创建xml文档对象

            QDomDocument doc;

            //创建xml头部格式<?xml version="1.0" encoding="UTF-8"?>

            QDomProcessingInstruction ins;

            ins=doc.createProcessingInstruction("xml","version="1.0" encoding="UTF-8"");

            //追加元素

            doc.appendChild(ins);

 

            //根节点元素

            QDomElement root=doc.createElement("日期销售清单");

            doc.appendChild(root);

 

            //保存

            QTextStream stream(&file);//文本流关联文件

            doc.save(stream,4); //4代表缩进4个字符

 

        }

        else

        {//文件打开失败

            cout<<"open file error";

            return ;

        }

    }

        file.close();

}

 

//搭建XML格式

void DomXML::AppendXML(QString strFilePath,QStringList list)

{

    //打开文件

    QFile file(strFilePath);

    bool bIsOk=file.open(QIODevice::ReadOnly);

    if(bIsOk)

    {

        //file和xml文档对象关联

        QDomDocument doc;

        bIsOk=doc.setContent(&file);

 

        if(bIsOk)

        {//关联成功

            file.close();

            //根节点元元素

            QDomElement root=doc.documentElement();

            //获取当地时间

            QDateTime date=QDateTime::currentDateTime();

            QString strDate=date.toString("yyyy-MM-dd");//2018-2-8

 

            //qDebug()<<strDate;

            //判断根节点下有没有子节点

            if(root.hasChildNodes())

            {

                //查找最后一个子节点

                QDomElement lastEmt=root.lastChildElement();

                //日期相同,同一天不创建新节点

                if(lastEmt.attribute("date")==strDate)

                {//相同直接写入

                     WriteXML(doc,lastEmt,list);

                }

                else

                {//不相同创建新节点

                    //创建日期子节点元素

                    QDomElement dateEmt=doc.createElement("日期");

                    //创建date属性

                    QDomAttr dateAttr=doc.createAttribute("date");

                    //设置属性的值

                    dateAttr.setNodeValue(strDate);

                    //节点和属性关联

                    dateEmt.setAttributeNode(dateAttr);

                    //把日期节点追加到根节点

                    root.appendChild(dateEmt);

 

                    WriteXML(doc,dateEmt,list);

                }

            }

            else

            {//没有子节点

                //创建日期子节点元素

                QDomElement dateEmt=doc.createElement("日期");

                //创建date属性

                QDomAttr dateAttr=doc.createAttribute("date");

                //设置属性的值

                dateAttr.setNodeValue(strDate);

                //节点和属性关联

                dateEmt.setAttributeNode(dateAttr);

                //把日期节点追加到根节点

                root.appendChild(dateEmt);

 

                WriteXML(doc,dateEmt,list);

 

            }

            bIsOk=file.open(QIODevice::WriteOnly);

            if(bIsOk)

            {

                //保存

                QTextStream stream(&file);//文本流关联文件

                doc.save(stream,4); //4代表缩进4个字符

            }

            file.close();

 

        }

        else

        {

            cout<<"setContent error";

            return ;

        }

    }

    else

    {

        cout<<"open file error";

        return ;

    }

}

 

//写XML

void DomXML::WriteXML(QDomDocument &doc,QDomElement &root,QStringList list)

{

    //获取当地时间

    QDateTime time=QDateTime::currentDateTime();

    QString strTime=time.toString("hh-mm-ss");//20:20:20

 

    //创建时间节点元素

    QDomElement timeEmt=doc.createElement("时间");

    //创建元素属性

    QDomAttr timeAttr=doc.createAttribute("time");

    //设置属性的值

    timeAttr.setNodeValue(strTime);

    //时间节点与属性相关联

    timeEmt.setAttributeNode(timeAttr);

    //将时间节点追加到日期节点后

    root.appendChild(timeEmt);

 

    QDomElement factory=doc.createElement("厂家");

    QDomElement brand=doc.createElement("品牌");

    QDomElement price=doc.createElement("价格");

    QDomElement num=doc.createElement("数量");

    QDomElement total=doc.createElement("金额");

 

    //设置文本内容并追加到前节点元素

    QDomText text=doc.createTextNode(list.at(0));

    factory.appendChild(text);

 

    text=doc.createTextNode(list.at(1));

    brand.appendChild(text);

 

    text=doc.createTextNode(list.at(2));

    price.appendChild(text);

 

    text=doc.createTextNode(list.at(3));

    num.appendChild(text);

 

    text=doc.createTextNode(list.at(4));

    total.appendChild(text);

 

    //将厂家、价格等节点追加到哦时间节点

    timeEmt.appendChild(factory);

    timeEmt.appendChild(brand);

    timeEmt.appendChild(price);

    timeEmt.appendChild(num);

    timeEmt.appendChild(total);

}

 

//读XML

void DomXML::ReadXML(QString strFilePath,QStringList &fList,QStringList &bList,QStringList &pList,QStringList &nList,QStringList &tList)

{

    QFile file(strFilePath);

    bool bIsOk=file.open(QIODevice::ReadOnly);

 

    QDateTime date=QDateTime::currentDateTime();

    QString strDate=date.toString("yyyy-MM-dd");

 

    if(bIsOk)

    {

        QDomDocument doc;

        bIsOk=doc.setContent(&file);

        if(bIsOk)

        {

            QDomElement root=doc.documentElement();

            //是否有子节点

            if(root.hasChildNodes())

            {

               QDomElement lastEmt=root.lastChildElement();

               if(lastEmt.attribute("date")==strDate)

               {//找到当天日期下所有时间子节点

                   QDomNodeList list=lastEmt.childNodes();

                   for(int i=0;i<list.size();++i)

                   {

                       QDomNodeList subList=list.at(i).toElement().childNodes();

 

                       //厂家

                       QString factory=subList.at(0).toElement().text();

                       fList.append(factory);

                       //品牌

                       QString brand=subList.at(1).toElement().text();

                       bList.append(brand);

                       //价格

                       QString price=subList.at(2).toElement().text();

                       pList.append(price);

                       //数量

                       QString num=subList.at(3).toElement().text();

                       nList.append(num);

                       //金额

                       QString total=subList.at(4).toElement().text();

                       tList.append(total);

 

                   }

               }

               else

               {

                   qDebug()<<"没有当天日期";

                   return ;

               }

            }

        }

 

    }

    else

    {

       cout<<"open file error";

    }

}

 

 

 

测试调用部分

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QStringList>

#include <QDebug>

 

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

 

    QStringList list;

    list<<"二汽神龙"<<"毕加索"<<"39"<<"1"<<"20";

    DomXML::CreateXML("../demo.xml");

    DomXML::AppendXML("../demo.xml",list);

 

    QStringList fList;

    QStringList bList;

    QStringList pList;

    QStringList nList;

    QStringList tList;

    DomXML::ReadXML("../demo.xml",fList,bList,pList,nList,tList);

 

    for(int i=0;i<fList.size();++i)

    {

        QString str=QString("%1:%2:卖出了%3,单价:%4总价:%5")

                    .arg(fList.at(i))

                .arg(bList.at(i))

                .arg(nList.at(i))

                .arg(pList.at(i))

                .arg(tList.at(i));

 

        qDebug()<<str.toUtf8().data();

    }

}

 

MainWindow::~MainWindow()

{

    delete ui;

}

 

技术分享图片

 技术分享图片

 

以上是关于39XML文档类的主要内容,如果未能解决你的问题,请参考以下文章

C#XmlHelper帮助类操作Xml文档的通用方法汇总

带有接口和实现类的 XML 文档注释 [关闭]

Actionscript文档类XML加载模板

C#实体类生成XML与XML Schema文档

从类路径资源解析 XML 文档时出现意外异常

如何使生成的类包含 XML Schema 文档中的 Javadoc