QtCreator 使用DOM创建和操作(添加,删除,更新)XML

来源:互联网 发布:淘宝免费购物 编辑:程序博客网 时间:2024/06/14 05:55

1 创建XML

1.1 新建Qt Widget应用myDom2,类名MainWindow,基类为MainWindow.   

加载QXml模块,在项目文件(.pro)中添加 QT += xml

QT       += xml

设置中文显示

    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
1.2 生成一棵DOM树,再调用save()函数利用QTextStream文本流将DOM树保存在文件中。

    //创建XML的文档对象
    QDomDocument doc;
    //添加处理指令,即XML说明
    QDomProcessingInstruction instruction;
    instruction = doc.createProcessingInstruction("xml","versiong=\"1.0\" encode=\"UTF-8\"");
    doc.appendChild(instruction);

    //创建文档的根元素
    QDomElement root = doc.createElement(QString("书库"));
    doc.appendChild(root);

    //创建子元素
    QDomElement book = doc.createElement(QString("图书"));
    QDomAttr id=doc.createAttribute(QString("编号"));
    QDomElement title = doc.createElement(QString("书名"));
    QDomElement author = doc.createElement(QObject::tr("作者"));

    //设置元素的值及属性的值
    QDomText text;
    id.setValue(QString("1"));
    book.setAttributeNode(id);
    text = doc.createTextNode(QString("Qt"));
    title.appendChild(text);
    text = doc.createTextNode(QString("shiming"));
    author.appendChild(text);

    //设置元素的结构
    book.appendChild(title);
    book.appendChild(author);
    root.appendChild(book);

    //打开文件
    QFile file("my.xml");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return;
    //构造文本流
    QTextStream out(&file);
    //将文本流保存到文件,4为子元素缩进的字符数
    doc.save(out,4);
    file.close();

1.3 查找,删除,更新

1.3.1  打开xml文件并读到内存中

    //打开xml文件并读到内存中
    QFile file("my.xml");
    if (!file.open(QIODevice::ReadOnly)) return;
    QDomDocument doc;
    QString err;
    int errRow;
    int errCol;
    if (!doc.setContent(&file,&err,&errRow,&errCol)) {
        qDebug() << QString("%1,%2,%3").arg(err).arg(errRow).arg(errCol);
        file.close();
        return ;
    }
    file.close();

1.3.2 获取满足条件的节点列表

    //获取xml中所有标签名为Book的节点的节点列表,元素继承自节点
    QDomNodeList list = doc.elementsByTagName("Book");

1.3.3 

    //遍历找到符合条件的节点
    for (int i = 0; i < list.count(); i++) {
//将节点转换成元素
        QDomElement e = list.at(i).toElement();
        if (e.attribute(QString("id")) == ui->leBookId->text()) {//查找条件
            if ( operate == "delete" ) {
                //找到根节点,通过根节点删除子节点,在写入xml文件
                QDomElement root = doc.documentElement();
                root.removeChild(list.at(i));
                QFile file("my.xml");
                if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return;
                QTextStream out(&file);
                doc.save(out,4);
                file.close();
                ui->listWidget->clear();
                ui->listWidget->addItem(QString("删除成功!delete success!"));
            } else if (operate == "update") {
//
                QDomNodeList child = list.at(i).childNodes();
//找到title标签对应的节点,并设置值
                child.at(0).toElement().firstChild()
                        .setNodeValue(ui->leBookName->text());
                //找到author标签对应的节点,并设置值
                child.at(1).toElement().firstChild()
                        .setNodeValue(ui->leAuthor->text());
                QFile file("my.xml");
                if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return;
                QTextStream out(&file);
                doc.save(out,4);
                file.close();
                ui->listWidget->clear();
                ui->listWidget->addItem(QString("update Sucess"));
            } else if (operate == "find") {
                ui->listWidget->clear();
                ui->listWidget->addItem(e.tagName() + e.attribute(QString("id")));
                QDomNodeList list = e.childNodes();
                for (int i = 0; i < list.count(); i++) {
                    QDomNode node = list.at(i);
                    if (node.isElement())
                        ui->listWidget->
                                addItem(QString("%1:%2")
                                        .arg(node.toElement().tagName())
                                        .arg(node.toElement().text()));
                }
            }
        }
    }



0 0
原创粉丝点击