作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
目录
下载
windows环境编译(假编译)准备
对xml文件读、写、编辑、删除操作
写文件
读文件
删除节点编辑节点
官网:TinyXML download | SourceForge.net
下载完源码后打开发现里边源码就几个
没必要编译成静态库或者动态库,把上面列举的2个头文件和4个cpp文件拷贝(新建同名文件复制内容进去)到示例工程目录下即可直接使用。
#include <iostream> #include "tinyxml.h" using namespace std; int main() { // 新建的xml文件名字 string filename = "E:/api/tinyxml/temp/yolo.xml"; //新建一个xml文件 // 定义一个TiXmlDocument类指针 TiXmlDocument* pWriteDoc = new TiXmlDocument(); // xml的声明(三个属性:版本,编码格式,独立文件声明) TiXmlDeclaration* pDeclare = new TiXmlDeclaration("1.0", "UTF-8", "yes"); pWriteDoc->LinkEndChild(pDeclare); // 连接到最后 // 根节点 TiXmlElement* pRootElement = new TiXmlElement("annotation"); pWriteDoc->LinkEndChild(pRootElement); // 把根节点连接到最后 // 二级节点 TiXmlElement* pFolderElement = new TiXmlElement("folder"); pRootElement->LinkEndChild(pFolderElement); // 连接到根节点下 TiXmlText* folderContent = new TiXmlText("JPEGImages"); pFolderElement->LinkEndChild(folderContent); // 给folder节点添加文本 TiXmlElement* pFileNameElement = new TiXmlElement("filename"); pRootElement->LinkEndChild(pFileNameElement); // 连接到根节点下 TiXmlText* fileNameContent = new TiXmlText("1.bmp"); pFileNameElement->LinkEndChild(fileNameContent); // 给filename节点添加文本 TiXmlElement* pPathElement = new TiXmlElement("path"); pRootElement->LinkEndChild(pPathElement); // 连接到根节点下 TiXmlText* pathContent = new TiXmlText("E:/projects/pyHome/about_yolo/yolov5_bottleCap_defect_detection/VOCData/JPEGImages/1.bmp"); pPathElement->LinkEndChild(pathContent); // 给path节点添加文本 TiXmlElement* pSizeElement = new TiXmlElement("size"); pRootElement->LinkEndChild(pSizeElement); // 连接到根节点下 TiXmlElement* pWithElement = new TiXmlElement("width"); pSizeElement->LinkEndChild(pWithElement); // 连接到二级节点size节点下的三级节点 TiXmlText* withContent = new TiXmlText("1280"); // width节点文本 pWithElement->LinkEndChild(withContent); // 给三级节点width添加文本 TiXmlElement* pHeightElement = new TiXmlElement("height"); pSizeElement->LinkEndChild(pHeightElement); // 连接到二级节点size节点下的三级节点 TiXmlText* heightContent = new TiXmlText("960"); // height节点文本 pHeightElement->LinkEndChild(heightContent); // 给三级节点height添加文本 TiXmlElement* pDepthElement = new TiXmlElement("depth"); pSizeElement->LinkEndChild(pDepthElement); // 连接到二级节点size节点下的三级节点 TiXmlText* depthContent = new TiXmlText("3"); // depth节点文本 pDepthElement->LinkEndChild(depthContent); // 给三级节点depth添加文本 /// 保存到文件 pWriteDoc->SaveFile(filename.c_str()); printf("new xml success, file's name is %s\n\n", filename.c_str()); return 0; }
#include <iostream> #include "tinyxml.h" using namespace std; int main() { // 新建的xml文件名字 string filename = "E:/api/tinyxml/temp/yolo.xml"; //从文件中读取 // 定义一个TiXmlDocument类指针 TiXmlDocument* pReadDocument = new TiXmlDocument(); // 读取文件 if (!pReadDocument->LoadFile(filename.c_str())) { printf("Could not load example xml file %s. Error='%s'\n", filename.c_str(), pReadDocument->ErrorDesc()); return 0; } printf("read xml file success, file' name is %s \n\n", filename.c_str()); //读取文档声明信息(第一个子节点转换得到文档声明) TiXmlDeclaration* pDeclar = pReadDocument->FirstChild()->ToDeclaration(); if (pDeclar != NULL) { printf("read declare, version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding()); } // 得到文件根节点 TiXmlElement* pRootElement = new TiXmlElement("annotation"); pRootElement = pReadDocument->RootElement(); //遍历元素,打印 printf("begin read all xml element \n\n"); // 遍历所有的size // 函数FirstChildElement() : 找到指定名字的元素 // 函数NextSiblingElement : 在同一级元素中查找下一个指定名字的元素 int i = 0; for (TiXmlElement* pItem = pRootElement->FirstChildElement("size"); pItem; pItem = pItem->NextSiblingElement("size")) { printf("read the %d size \n", ++i); // 宽 TiXmlElement* pWith = pItem->FirstChildElement("with"); if (pWith != NULL) { printf("the %d size's with = %s \n", i, pWith->GetText()); } // 高 TiXmlElement* pHeight = pItem->FirstChildElement("height"); if (pHeight != NULL) { printf("the %d size's height = %s \n", i, pHeight->GetText()); } // 深度 TiXmlElement* pDepth = pItem->FirstChildElement("depth"); if (pDepth != NULL) { printf("the %d size's depth = %s \n", i, pDepth->GetText()); } printf("\n\n"); } return 0; }
#include <iostream> #include "tinyxml.h" using namespace std; int main() { // 新建的xml文件名字 string filename = "E:/api/tinyxml/temp/yolo.xml"; //从文件中读取 // 定义一个TiXmlDocument类指针 TiXmlDocument* pReadDocument = new TiXmlDocument(); // 读取文件 if (!pReadDocument->LoadFile(filename.c_str())) { printf("Could not load yolo xml file %s. Error='%s'\n", filename.c_str(), pReadDocument->ErrorDesc()); return 0; } printf("read xml file success, file' name is %s \n\n", filename.c_str()); //读取文档声明信息(第一个子节点转换得到文档声明) TiXmlDeclaration* pDeclar = pReadDocument->FirstChild()->ToDeclaration(); if (pDeclar != NULL) { printf("read declare, version is %s , encoding is %s\n", pDeclar->Version(), pDeclar->Encoding()); } // 得到文件根节点 TiXmlElement* pRootElement = new TiXmlElement("annotation"); pRootElement = pReadDocument->RootElement(); //删除元素,属性 TiXmlElement* pSize = pRootElement->FirstChildElement("size"); if (pSize != NULL) { // 这里演示删除"depth"元素,删除其他节点也是一样的办法 TiXmlElement* pDepth = pSize->FirstChildElement("depth"); if (pDepth != NULL) { pSize->RemoveChild(pDepth); } // 这里演示修改"addr"元素 TiXmlElement* pHeight = pSize->FirstChildElement("height"); if (pHeight != NULL) { pHeight->SetValue("height"); //修改节点文本 //pHeight->SetAttribute("name", "value"); // 修改属性值 } //text文本是height的FirstChild,因此也可用SetValue函数: TiXmlNode* pText = pHeight->FirstChild(); if (pText != NULL) { pText->SetValue("961"); } } // 再次保存到文件 if (pReadDocument->SaveFile(filename.c_str())) { printf("save file success\n"); } return 0; }
【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】