• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Qt-DOM之xml操作

Qt admin 3年前 (2016-05-22) 2089次浏览 0个评论 扫描二维码

qt 提供了三种方式解析 xml,不过如果想实现对 xml 文件进行增、删、改等操作,还是 DOM 方式最方便。



xml


 

QT       += core xml

QT       -= gui

TARGET = xmltest
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp

 

#include <QCoreApplication>

#include<QDomComment>
#include<QFile>
#include<QTextStream>
#include<QDebug>

//写操作
void  Dom_xml_write()
{
    QFile file("dom_test.xml");

    if(!file.open(QFile::WriteOnly| QFile::Truncate))
    {
        return;
    }
    // XML declaration
    QDomDocument doc;
    QDomProcessingInstruction instuct;
    instuct=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    doc.appendChild(instuct);

    //创建节点
    QDomElement root=doc.createElement("deeplearn");
    doc.appendChild(root);
    //创建子节点
    QDomElement qt_channel=doc.createElement("qt_channel");
    qt_channel.setAttribute("id",1);
    QDomAttr qt_start_time=doc.createAttribute("time");
    qt_start_time.setValue("2015/05/01");
    qt_channel.setAttributeNode(qt_start_time);
    QDomElement qt_title=doc.createElement("qt_title");

    QDomText qt_text=doc.createTextNode("qt");
    qt_title.appendChild(qt_text);
    qt_channel.appendChild(qt_title);
    root.appendChild(qt_channel);
    //创建子节点
    QDomElement ml_channel=doc.createElement("ml_channel");
    ml_channel.setAttribute("id",2);
    QDomAttr ml_start_time=doc.createAttribute("time");
    ml_start_time.setValue("2015/05/02");
    ml_channel.setAttributeNode(ml_start_time);
    QDomElement ml_title=doc.createElement("ml_title");

    QDomText ml_text=doc.createTextNode("ml");
    ml_title.appendChild(ml_text);
    ml_channel.appendChild(ml_title);

    root.appendChild(ml_channel);


    QTextStream filestream(&file);
    doc.save(filestream,4);
    file.close();
}
//读操作

void  Dom_xml_read()
{
    QFile file("dom_test.xml");
    if(!file.open(QFile::ReadOnly))
    {
        return;
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    //获取根节点
    QDomElement root=doc.documentElement();
    qDebug()<<root.nodeName();

    QDomNode first=root.firstChild();
    while(!first.isNull())
    {
        if(first.isElement())
        {
            QDomElement e=first.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
            qDebug()<<e.tagName()<<" "<<e.attribute("id")<<" "<<e.attribute("time"); //打印键值对,tagName 和
           // Name 是一个东西
            QDomNodeList list=e.childNodes();
            for(int i=0;i<list.count();i++) //遍历子元素,count 和 size 都可以用,可用于标签数计数
            {
                QDomNode n=list.at(i);
                if(first.isElement())
                    qDebug()<<n.nodeName()<<":"<<n.toElement().text();
            }
        }
        first=first.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
    }

}

//修改 xml
void Dom_xml_add()
{
    QFile file("dom_test.xml");
    if(!file.open(QFile::ReadOnly))
    {
        return;
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    //创建节点
    QDomElement root=doc.documentElement();
    //创建子节点
    QDomElement qt_channel=doc.createElement("qt_channel");
    qt_channel.setAttribute("id",1);
    QDomAttr qt_start_time=doc.createAttribute("time");
    qt_start_time.setValue("2015/05/01");
    qt_channel.setAttributeNode(qt_start_time);
    QDomElement qt_title=doc.createElement("qt_title");

    QDomText qt_text=doc.createTextNode("qt");
    qt_title.appendChild(qt_text);
    qt_channel.appendChild(qt_title);
    root.appendChild(qt_channel);
    if(!file.open(QFile::WriteOnly | QFile::Truncate))
    {
        file.close();
        return;
    }
    QTextStream out(&file);
    doc.save(out,4);
    file.close();

}
void Dom_xml_delete()
{
    QFile file("dom_test.xml");
    if(!file.open(QFile::ReadOnly))
    {
        return;
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    //获取根节点
    QDomElement root=doc.documentElement();

    QDomNodeList curr_list=doc.elementsByTagName("qt_channel");

    for(int i=0;i<curr_list.size();i++)
    {
        if(curr_list.at(i).isElement())
        {
            QDomElement e=curr_list.at(i).toElement();
            if(e.attribute("time")=="2015/05/01")  //以属性名定位,类似于 hash 的方式
            {
                //删除根节点的子节点
                  root.removeChild(curr_list.at(i));
            }
        }
    }
    if(!file.open(QFile::WriteOnly | QFile::Truncate))
    {
        file.close();
        return;
    }
    QTextStream out(&file);
    doc.save(out,4);
    file.close();




}

void Dom_xml_update()
{
    QFile file("dom_test.xml");
    if(!file.open(QFile::ReadOnly))
    {
        return;
    }
    QDomDocument doc;
    if(!doc.setContent(&file))
    {
        file.close();
        return;
    }
    file.close();
    //获取根节点
    QDomElement root=doc.documentElement();

    QDomNodeList curr_list=doc.elementsByTagName("qt_channel");

    //获取第一个子节点信息

    QDomNode node=curr_list.at(0).firstChild();
    QDomNode old_node=node.firstChild();
    node.firstChild().setNodeValue("my_qt");
    QDomNode new_node=node.firstChild();
    node.replaceChild(new_node,old_node);
    if(!file.open(QFile::WriteOnly | QFile::Truncate))
    {
        file.close();
        return;
    }
    QTextStream out(&file);
    doc.save(out,4);
    file.close();



}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //Dom_xml_write();
   // Dom_xml_read();
    //Dom_xml_add();
    //Dom_xml_delete();
    Dom_xml_update();
    return a.exec();
}


实现的结果如下:

初始写 xml:

LLQP6{DYKVGA9GMSM}F62H2

xml 增加:

[X~FD7XD2ZEXK}RAN(R44TB

xml 删除:

2CZJ7XS$~F~%H`HG_K~)W(A

xml 更新:

]W(5JWLRIUE9$JZ%TZ6CYG8

 


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Qt-DOM 之 xml 操作
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!