(资料图片仅供参考)
TinyXML download | SourceForge.net
新建个Qt工程,下载TinyXML,把压缩包中的tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp添加到工程中
//文档类TiXmlDocument* pDocument = new TiXmlDocument();//声明类TiXmlDeclaration* pDeclaration = new TiXmlDeclaration(\"1.0\",\"UTF-8\",\"\");pDocument->LinkEndChild(pDeclaration);//注释类TiXmlComment* pComment = new TiXmlComment();pComment->SetValue(\"Person TinyXML\" );pDocument->LinkEndChild(pComment);//元素类TiXmlElement *pElement = new TiXmlElement(\"Person\");pElement->SetAttribute(\"index\", 0); //属性pDocument->LinkEndChild(pElement);//文本类TiXmlText *pText = new TiXmlText(\"name\");pElement->LinkEndChild(pText);//保存pDocument->SaveFile(\"test.xml\");
执行上面的代码生成如下的XML文件,第一行是声明;第二行是注释;
第三行是元素类,index是属性,name是文本
void MainWindow::addData(){TiXmlDocument* pDocument = new TiXmlDocument();if(pDocument->LoadFile(m_fileName.toStdString().c_str())) //加载xml,test.xml存在时{//清空文件内容pDocument->Clear();}//声明类TiXmlDeclaration* pDeclaration = new TiXmlDeclaration(\"1.0\",\"UTF-8\",\"\");pDocument->LinkEndChild(pDeclaration);//注释类TiXmlComment* pComment = new TiXmlComment();pComment->SetValue(\"Person TinyXML\" );pDocument->LinkEndChild(pComment);//元素类TiXmlElement *pRootLv1 = new TiXmlElement(\"Person\"); //创建一个根结点pDocument->LinkEndChild(pRootLv1);//添加老师addTeacher(pRootLv1);//添加学生addStudent(pRootLv1);//保存pDocument->SaveFile();}void MainWindow::addTeacher(TiXmlElement *pRoot){TiXmlElement *pRootLv1 = new TiXmlElement(\"Teachers\"); //创建一个节点pRoot->LinkEndChild(pRootLv1); //链接到节点pRoot下int index = 0;addTeacherData(pRootLv1, index, \"赵老师\", 28);index++;addTeacherData(pRootLv1, index, \"王老师\", 29);}void MainWindow::addTeacherData(TiXmlElement *pRoot, int index, QString name, int age){TiXmlElement *pRootLv1 = new TiXmlElement(\"Teacher\"); //创建一个节点pRoot->LinkEndChild(pRootLv1); //链接到节点pRoot下pRootLv1->SetAttribute(\"index\", index);pRootLv1->SetAttribute(\"type\", 0);TiXmlElement *pRootLv21 = new TiXmlElement(\"name\");pRootLv1->LinkEndChild(pRootLv21);TiXmlText *pText1 = new TiXmlText(name.toStdString().c_str());pRootLv21->LinkEndChild(pText1);TiXmlElement *pRootLv22 = new TiXmlElement(\"age\");pRootLv1->LinkEndChild(pRootLv22);TiXmlText *pText2 = new TiXmlText(QString::number(age).toStdString().c_str());pRootLv22->LinkEndChild(pText2);}void MainWindow::addStudent(TiXmlElement *pRoot){TiXmlElement *pRootLv1 = new TiXmlElement(\"Students\"); //创建一个节点pRoot->LinkEndChild(pRootLv1); //链接到节点pRoot下int index = 0;addStudentData(pRootLv1, index, \"张三\", 18, 90.1);index++;addStudentData(pRootLv1, index, \"李四\", 19, 89.5);index++;addStudentData(pRootLv1, index, \"王五\", 17, 93);}void MainWindow::addStudentData(TiXmlElement *pRoot, int index, QString name, int age, double score){TiXmlElement *pRootLv1 = new TiXmlElement(\"Student\"); //创建一个节点pRoot->LinkEndChild(pRootLv1); //链接到节点pRoot下pRootLv1->SetAttribute(\"index\", index);pRootLv1->SetAttribute(\"type\", 1);TiXmlElement *pRootLv21 = new TiXmlElement(\"name\");pRootLv1->LinkEndChild(pRootLv21);TiXmlText *pText1 = new TiXmlText(name.toStdString().c_str());pRootLv21->LinkEndChild(pText1);TiXmlElement *pRootLv22 = new TiXmlElement(\"age\");pRootLv1->LinkEndChild(pRootLv22);TiXmlText *pText2 = new TiXmlText(QString::number(age).toStdString().c_str());pRootLv22->LinkEndChild(pText2);TiXmlElement *pRootLv23 = new TiXmlElement(\"score\");pRootLv1->LinkEndChild(pRootLv23);TiXmlText *pText3 = new TiXmlText(QString::number(score).toStdString().c_str());pRootLv23->LinkEndChild(pText3);}
生成XML如下
void MainWindow::showData(){TiXmlDocument* pDocument = new TiXmlDocument();if(!pDocument->LoadFile(m_fileName.toStdString().c_str())) //加载xml,test.xml不存在时{qDebug() << pDocument->ErrorDesc();return;}//获取根节点值TiXmlElement* pRootLv1 = pDocument->RootElement();const char* elemValue = pRootLv1->Value();if(strcmp(elemValue, \"Person\") != 0){qDebug() << \"Person error\";return;}for(TiXmlElement* pRootLv2 = pRootLv1->FirstChildElement();pRootLv2 != nullptr; pRootLv2 = pRootLv2->NextSiblingElement()){const char* elemValue = pRootLv2->Value();if(strcmp(elemValue, \"Teachers\") == 0){for(TiXmlElement* pRootLv3 = pRootLv2->FirstChildElement();pRootLv3 != nullptr; pRootLv3 = pRootLv3->NextSiblingElement()){elemValue = pRootLv3->Value();if(strcmp(elemValue, \"Teacher\") == 0){int index = 0;//读取int属性用pRootLv4->QueryIntAttribute(\"属性名称\", &value);//读取double属性用pRootLv4->QueryDoubleAttribute(\"属性名称\", &value);//读取字符串属性用value = sublistElem->Attribute(\"属性名称\");pRootLv3->QueryIntAttribute(\"index\", &index);//读textTiXmlElement* pRootLv4 = pRootLv3->FirstChildElement(\"name\");QString name = pRootLv4->FirstChild()->ToText()->Value();pRootLv4 = pRootLv3->FirstChildElement(\"age\");QString ageStr = pRootLv4->FirstChild()->ToText()->Value();int age = ageStr.toInt();qDebug() << \"编号:\" << index << \" 姓名:\" << name << \" 年龄:\" << age;}}}else if(strcmp(elemValue, \"Students\") == 0){for(TiXmlElement* pRootLv3 = pRootLv2->FirstChildElement();pRootLv3 != nullptr; pRootLv3 = pRootLv3->NextSiblingElement()){elemValue = pRootLv3->Value();if(strcmp(elemValue, \"Student\") == 0){int index = 0;pRootLv3->QueryIntAttribute(\"index\", &index);//读textTiXmlElement* pRootLv4 = pRootLv3->FirstChildElement(\"name\");QString name = pRootLv4->FirstChild()->ToText()->Value();pRootLv4 = pRootLv3->FirstChildElement(\"age\");QString ageStr = pRootLv4->FirstChild()->ToText()->Value();int age = ageStr.toInt();pRootLv4 = pRootLv3->FirstChildElement(\"score\");QString scoreStr = pRootLv4->FirstChild()->ToText()->Value();double score = ageStr.toDouble();qDebug() << \"编号:\" << index << \" 姓名:\" << name << \" 年龄:\" << age << \" 成绩:\" << score;}}}}}
输出如下:
void MainWindow::changeData(){QString nameC = \"王老师\";int ageC = 25;TiXmlDocument* pDocument = new TiXmlDocument();if(!pDocument->LoadFile(m_fileName.toStdString().c_str())) //加载xml,test.xml不存在时{qDebug() << pDocument->ErrorDesc();return;}//获取根节点值TiXmlElement* pRootLv1 = pDocument->RootElement();const char* elemValue = pRootLv1->Value();if(strcmp(elemValue, \"Person\") != 0){qDebug() << \"Person error\";return;}for(TiXmlElement* pRootLv2 = pRootLv1->FirstChildElement();pRootLv2 != nullptr; pRootLv2 = pRootLv2->NextSiblingElement()){const char* elemValue = pRootLv2->Value();if(strcmp(elemValue, \"Teachers\") == 0){for(TiXmlElement* pRootLv3 = pRootLv2->FirstChildElement();pRootLv3 != nullptr; pRootLv3 = pRootLv3->NextSiblingElement()){elemValue = pRootLv3->Value();if(strcmp(elemValue, \"Teacher\") == 0){//修改属性// int index = 0;// pRootLv3->SetAttribute(\"index\", QString::number(index).toStdString().c_str());TiXmlElement* pRootLv4 = pRootLv3->FirstChildElement(\"name\");QString name = pRootLv4->FirstChild()->ToText()->Value();if(name == nameC){//修改textpRootLv4 = pRootLv3->FirstChildElement(\"age\");pRootLv4->FirstChild()->SetValue(QString::number(ageC).toStdString().c_str());}}}}}pDocument->SaveFile();}王老师的age被更改为25
void MainWindow::deleteData(){QString nameC = \"王老师\";TiXmlDocument* pDocument = new TiXmlDocument();if(!pDocument->LoadFile(m_fileName.toStdString().c_str())) //加载xml,test.xml不存在时{qDebug() << pDocument->ErrorDesc();return;}//获取根节点值TiXmlElement* pRootLv1 = pDocument->RootElement();const char* elemValue = pRootLv1->Value();if(strcmp(elemValue, \"Person\") != 0){qDebug() << \"Person error\";return;}for(TiXmlElement* pRootLv2 = pRootLv1->FirstChildElement();pRootLv2 != nullptr; pRootLv2 = pRootLv2->NextSiblingElement()){const char* elemValue = pRootLv2->Value();if(strcmp(elemValue, \"Teachers\") == 0){for(TiXmlElement* pRootLv3 = pRootLv2->FirstChildElement();pRootLv3 != nullptr; pRootLv3 = pRootLv3->NextSiblingElement()){elemValue = pRootLv3->Value();if(strcmp(elemValue, \"Teacher\") == 0){TiXmlElement* pRootLv4 = pRootLv3->FirstChildElement(\"name\");QString name = pRootLv4->FirstChild()->ToText()->Value();if(name == nameC){//删除子节点pRootLv2->RemoveChild(pRootLv3);}}}}}pDocument->SaveFile();}
王老师的信息被删除
【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】
点击这里: