QT学习笔记(8)-QDomDocument解析以及QTableView显示

目录

  • 对xml使用QDomDocument进行读写发生的错误
  • 对xml文件使用QDomDocument进行解析
  • 将xml文件,用QTableView进行显示
  • 参考文献

对xml使用QDomDocument进行读写发生的错误

首先,你切记要在,pro文件中,加入 QT += xml,不然你就会出现这个错误:
NK2019: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl QDomElement::~QDomElement(void)” (_imp??1QDomElement@@QEAA@XZ),该符号在函数 “void __cdecl WriteXml(void)” (?WriteXml@@YAXXZ) 中被引用()
当然如果出现这个错误,也有可能不是这个问题,那么就请你参考这个人写的:
https://blog.csdn.net/ygzhong000/article/details/44843371

对xml文件使用QDomDocument进行解析

code:

void ReadXml()
{
    //打开或创建文件
    QFile file("mytest.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();
    QDomElement nodeElement=root.firstChildElement(); //获得第一个子节点

    while(!nodeElement.isNull()){
        qDebug()<<nodeElement.nodeName()<<nodeElement.attribute ("Name")<<nodeElement.attribute ("Age")<<nodeElement.attribute ("English")<<nodeElement.attribute ("Math");
        //不能用qPrintable,会无法显示中文
        nodeElement=nodeElement.nextSiblingElement();

    }
//    while(!node.isNull())  //如果节点不空
//    {
//        if(node.isElement()) //如果节点是元素
//        {
//            QDomElement e=node.toElement(); //转换为元素,注意元素和节点是两个数据结构,其实差不多
//            qDebug()<
//            QDomNodeList list=e.childNodes();
//            for(int i=0;i
//            {
//                QDomNode n=list.at(i);
//                if(node.isElement())
//                    qDebug()<
//            }
//        }
//        node=node.nextSibling(); //下一个兄弟节点,nextSiblingElement()是下一个兄弟元素,都差不多
//    }

}

里面很多注释的代码是用于有子节点的,我待会会把文件给出。但应该大部分用我写的那个就可以了。就可以全部遍历到了。

将xml文件,用QTableView进行显示

code:

QFile file("mytest.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();
    QDomElement nodeElement=root.firstChildElement(); //获得第一个子节点
    QStandardItemModel* model = new QStandardItemModel(this);
    model->setColumnCount(3);
    model->setRowCount(3);
    QStringList list;
    list<<"name"<<"english"<<"math";
    model->setHorizontalHeaderLabels(list);
    for(int i=0;!nodeElement.isNull();i++){
       model->setData(model->index(i,0),nodeElement.attribute ("Name"));
       model->setData(model->index(i,1),nodeElement.attribute ("English"));
       model->setData(model->index(i,2),nodeElement.attribute ("Math"));
     
//         model->setData(i, 0, new QStandardItem(nodeElement.nodeName()));
//         model->setItem(i, 1, new QStandardItem(nodeElement.attribute ("Name")));
//         model->setItem(i, 2, new QStandardItem(nodeElement.attribute ("English")));
//         model->setItem(i,3, new QStandardItem(nodeElement.attribute ("Math")));
       nodeElement=nodeElement.nextSiblingElement();
    }

//     model->setItem(0, 0, new QStandardItem("zhangsan"));
//     model->setItem(0, 1, new QStandardItem("3"));
//     model->setItem(0, 2, new QStandardItem("man"));
       this->setModel(model);

这样就可以实现了。代码我就上传了,可以运行的。

代码如下:
Code
若后面分数变得较高,积分不够的话,可以私信我,我会发给你的。

参考文献

  1. Qt中使用QDomDocument读写XML文件
  2. Qt5 error LNK2019 无法解析的外部符号 解决办法
  3. Qt5 对xml文件常用的操作(读写,增删改查)

你可能感兴趣的:(QT,qt)