一个大型的软件系统,通常有多个地方需要对XML文件进行进行操作,将pugiXML的相关功能编译成一个动态库非常方便。源码和linux系统的makefile在目录XML_demo/pugiXML/pugiXmlLib下。
在linux系统下,cd至该目录下,然后运行
make rebuild
make install
就可以将pugiXML编译成一个动态库libpugixml.so
XML文件的创建代码如下
int generateXML(const char* xmlName)
{
// XML文件声明
pugi::xml_document demoXML;
pugi::xml_node decl = demoXML.prepend_child(pugi::node_declaration);
decl.append_attribute("version") = "1.0";
decl.append_attribute("encoding") = "UTF-8";
decl.append_attribute("standalone") = "yes";
pugi::xml_node nodeRoot = demoXML.append_child("Root");
pugi::xml_node nodeBookNum = nodeRoot.append_child("BookNum");
nodeBookNum.append_child(pugi::node_pcdata).set_value("2");
pugi::xml_node nodeBooks = nodeRoot.append_child("Books");
nodeBooks.append_attribute("name") = "myBookList";
pugi::xml_node nodebook1 = nodeBooks.append_child("book");
pugi::xml_node nodename1 = nodebook1.append_child("name");
nodename1.append_child(pugi::node_pcdata).set_value("Signal Processing");
pugi::xml_node nodepublisher1 = nodebook1.append_child("publisher");
nodepublisher1.append_child(pugi::node_pcdata).set_value("Education");
pugi::xml_node nodebook2 = nodeBooks.append_child("book");
pugi::xml_node nodename2 = nodebook2.append_child("name");
nodename2.append_child(pugi::node_pcdata).set_value("SAR");
pugi::xml_node nodepublisher2 = nodebook2.append_child("publisher");
nodepublisher2.append_child(pugi::node_pcdata).set_value("Education");
demoXML.save_file(xmlName);
return 0;
}
运行上述函数后,生成的XML文件如下所示:
使用下面的函数,读取上一节生成的XML文件:
int readXML(const char* xmlName)
{
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file(xmlName);
if (result.status == 0)
{
// cout << "加载成功 " << endl;
}
else
{
cout << " 加载xml失败 " << xmlName << endl;
return -1;
}
pugi::xml_node nodeRoot = doc.child("Root");
if (nodeRoot)
{
string bookNum = nodeRoot.child("BookNum").first_child().value();
printf("BookNum: %d\n", atoi(bookNum.c_str()));
pugi::xml_node nodeBooks = nodeRoot.child("Books");
for (pugi::xml_node nodebook = nodeBooks.child("book"); nodebook; nodebook = nodebook.next_sibling("book"))
{
pugi::xml_node nodename = nodebook.child("name");
printf("name : %s\n",nodename.first_child().value());
pugi::xml_node nodepublisher = nodebook.child("publisher");
printf("publisher: %s\n",nodepublisher.first_child().value());
}
}
else
{
cout << "ERROR!!!根节点不是Root,xml文件格式错误 \n" << endl;
return -1;
}
return 0;
}
XML文件的修改包括增加、删除、修改node的内容,详细函数如下所示。
int modifyXML(const char* xmlName)
{
pugi::xml_document doc;
pugi::xml_parse_result result = doc.load_file(xmlName);
if (result.status == 0)
{
// cout << "加载成功 " << endl;
}
else
{
cout << " 加载xml失败 " << xmlName << endl;
return -1;
}
pugi::xml_node nodeRoot = doc.child("Root");
if (nodeRoot)
{
string bookNum = nodeRoot.child("BookNum").first_child().value();
printf("BookNum: %d\n", atoi(bookNum.c_str()));
pugi::xml_node nodeBooks = nodeRoot.child("Books");
for (pugi::xml_node nodebook = nodeBooks.child("book"); nodebook; nodebook = nodebook.next_sibling("book"))
{
pugi::xml_node nodename = nodebook.child("name");
printf("name : %s\n",nodename.first_child().value());
nodename.text().set("hhh"); // 修改
pugi::xml_node nodepublisher = nodebook.child("publisher");
printf("publisher: %s\n",nodepublisher.first_child().value());
nodebook.remove_child("publisher"); // 删除
pugi::xml_node isdn = nodebook.append_child("isdn");
isdn.append_child(pugi::node_pcdata).set_value("123-456-789"); // 增加
pugi::xml_node pagenode = nodebook.insert_child_before("page", nodename);
pagenode.append_child(pugi::node_pcdata).set_value("1234"); // 增加
pugi::xml_node ownnode = nodebook.insert_child_after("owner", isdn);
ownnode.append_child(pugi::node_pcdata).set_value("Tom"); // 增加
}
}
else
{
cout << "ERROR!!!根节点不是Root,xml文件格式错误 \n" << endl;
return -1;
}
doc.print(std::cout);
doc.save_file(xmlName);
return 0;
}
注,下面的链接是tinyxml的使用样例:CSDNhttps://mp.csdn.net/mp_download/manage/download/UpDetailed