遍历xml所有节点下的数据已经在上一篇文章末尾写道,写法大同小异,资源下载也在上一篇提到,
这里就不再提及,这篇博客主要是对上一篇基础知识的运用,如有疑问,可以call我
XML解析类
#include <iostream>
#include <string>
#include <string.h>
#include "tinystr.h"
#include "tinyxml.h"
using namespace std;
class anl_Xml
{
public:
char* m_Filename;
TiXmlDocument xmlDocument;
anl_Xml(string filename)
{
m_Filename = &filename[0];
init();
}
void init()
{
if (!xmlDocument.LoadFile(m_Filename)) // 需要解析的xml文件
{
cout << "未找到文件" << endl;
}
else
{
cout << "成功!!" << endl;
}
}
bool display_xml(const char* node_name, const char* data_name); // 指定节点 下的指定数据打印输出
bool insert_xml(const char* node_name, const char* data_name[]); // 指定节点下添加一条数据
bool del_xml(const char* node_name, const char* data_name); // 指定节点下删除 指定数据
bool update_xml(const char* node_name,const char* update_name, const char* data_name[]); // 指定节点和数据,进行修改
};
int main()
{
anl_Xml xml("D:/visual_2019_project/Project7/new.xml");
//xml.display_xml("rtdb","HmiLoopCount");
//const char* data_name[5] = {"new","long","8","0","新添加"};
//xml.insert_xml("rtdb", data_name);
//xml.del_xml("rtdb", "new");
const char* data_name[5] = { "new-1","int","3","0","修改的" };
xml.update_xml("rtdb","new",data_name);
return 0;
}
1 指定节点名和节点下的属性(查)

bool anl_Xml::display_xml(const char* node_name, const char* data_name)
{ // node_name ="rtdb" 节点名, data_name="HmiLoopCount" 节点下的数据名
TiXmlElement* xmlRoot = xmlDocument.RootElement(); // 找根节点
// 找根节点下名字为 node_name的节点
for (TiXmlElement* elem = xmlRoot->FirstChildElement(node_name); elem != NULL; elem = elem->NextSiblingElement())
{
const char* node_attribute = elem->Attribute("name"); // 找到node_name节点的name属性,返回值const char*
cout << node_name<<"的name属性= " << node_attribute<<endl;
for (TiXmlElement* elem1 = elem->FirstChildElement(); elem1 != NULL; elem1 = elem1->NextSiblingElement())
{
if (strcmp(elem1->Attribute("name"),data_name)==0)
{
const char* name = elem1->Attribute("name"); // data节点下的属性
const char* type = elem1->Attribute("type"); // data节点下的属性
const char* init = elem1->Attribute("init"); // data节点下的属性
const char* length = elem1->Attribute("length"); // data节点下的属性
cout << data_name << ":" << name << " " << type << " " << init << " " << length << endl; // 加上空格
}
}
break; // 找到这个node_name 节点就退出
}
return true;
}
2 指定节点 往里面添加一条数据(添加)

bool anl_Xml::insert_xml(const char* node_name, const char* data_name[])
{ // node_name ="rtdb" 节点名,
TiXmlElement* xmlRoot = xmlDocument.RootElement(); // 找根节点
// 找根节点下名字为 node_name的节点
for (TiXmlElement* elem = xmlRoot->FirstChildElement(node_name); elem != NULL; elem = elem->NextSiblingElement())
{
TiXmlElement* xmlChild1 = new TiXmlElement("data");
elem->LinkEndChild(xmlChild1);
xmlChild1->SetAttribute("name", data_name[0]);//设置属性
xmlChild1->SetAttribute("type", data_name[1]);//设置属性
xmlChild1->SetAttribute("length", data_name[2]);//设置属性
xmlChild1->SetAttribute("init", data_name[3]);//设置属性
xmlChild1->SetAttribute("description", data_name[4]);//设置属性
//保存xml文件
xmlDocument.SaveFile("new.xml");
break;
}
return true;
}
3 指定节点和节点下的数据删除(删除)

bool anl_Xml::del_xml(const char* node_name, const char* data_name)
{ // node_name ="rtdb" 节点名, data_name="HmiLoopCount" 节点下的数据名
TiXmlElement* xmlRoot = xmlDocument.RootElement(); // 找根节点
// 找根节点下名字为 node_name的节点
for (TiXmlElement* elem = xmlRoot->FirstChildElement(node_name); elem != NULL; elem = elem->NextSiblingElement())
{
for (TiXmlElement* elem1 = elem->FirstChildElement(); elem1 != NULL; elem1 = elem1->NextSiblingElement())
{
if (strcmp(elem1->Attribute("name"), data_name) == 0)
{
elem->RemoveChild(elem1); // 删除指定数据
xmlDocument.SaveFile("new.xml");
break;
}
}
break; // 找到这个node_name 节点就退出
}
return true;
}
4 指定节点和数据进行修改(修改)

bool anl_Xml::update_xml(const char* node_name, const char* update_name, const char* data_name[])
{ // node_name ="rtdb" 节点名,
TiXmlElement* xmlRoot = xmlDocument.RootElement(); // 找根节点
// 找根节点下名字为 node_name的节点
for (TiXmlElement* elem = xmlRoot->FirstChildElement(node_name); elem != NULL; elem = elem->NextSiblingElement())
{
for (TiXmlElement* elem1 = elem->FirstChildElement(); elem1 != NULL; elem1 = elem1->NextSiblingElement())
{
if (strcmp(elem1->Attribute("name"), update_name) == 0)
{
elem1->SetAttribute("name", data_name[0]);//设置属性
elem1->SetAttribute("type", data_name[1]);//设置属性
elem1->SetAttribute("length", data_name[2]);//设置属性
elem1->SetAttribute("init", data_name[3]);//设置属性
elem1->SetAttribute("description", data_name[4]);//设置属性
//保存xml文件
xmlDocument.SaveFile("new.xml");
break;
}
}
break;
}
return true;
}
总结
解析xml文件大部分代码都差不多,掌握核心最重要
版权声明:本文为weixin_45715405原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。