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

16 篇文章 0 订阅
3 篇文章 0 订阅

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()));
                }
            }
 
        }
    }



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值