-
2021-07-31 16:01:19
#include "../TinyXML2/tinyxml2.h"
int test_tinyxml2_create()
{
const char* declaration = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
tinyxml2::XMLDocument doc;
tinyxml2::XMLError ret = doc.Parse(declaration);
if (ret != 0) {
fprintf(stderr, "fail to parse xml file: %s\n", declaration);
return -1;
}tinyxml2::XMLComment* comment = doc.NewComment("this is a xml test file");
doc.InsertEndChild(comment);tinyxml2::XMLElement* root = doc.NewElement("Root");
doc.InsertEndChild(root);// User
tinyxml2::XMLElement* user = doc.NewElement("User");
user->SetAttribute("Name", "fengbingchun");
root->InsertEndChild(user);tinyxml2::XMLElement* blog = doc.NewElement("Blog");
tinyxml2::XMLText* text1 = doc.NewText("CSDN");
blog->InsertEndChild(text1);
user->InsertEndChild(blog);tinyxml2::XMLElement* code = doc.NewElement("Code");
tinyxml2::XMLText* text2 = doc.NewText("GitHub");
code->InsertEndChild(text2);
user->InsertEndChild(code);// Blog
tinyxml2::XMLElement* blog2 = doc.NewElement("Blog");
blog2->SetAttribute("Name", "CSDN");
root->InsertEndChild(blog2);tinyxml2::XMLElement* addr = doc.NewElement("Address");
tinyxml2::XMLText* text3 = doc.NewText("https://blog.csdn.net/fengbingchun");
addr->InsertEndChild(text3);
blog2->InsertEndChild(addr);tinyxml2::XMLElement* id = doc.NewElement("ID");
tinyxml2::XMLText* text4 = doc.NewText("fengbingchun");
id->InsertEndChild(text4);
blog2->InsertEndChild(id);// Code
tinyxml2::XMLElement* code2 = doc.NewElement("Code");
code2->SetAttribute("Name", "GitHub");
root->InsertEndChild(code2);tinyxml2::XMLElement* addr2 = doc.NewElement("Address");
tinyxml2::XMLText* text5 = doc.NewText("https://github.com//fengbingchun");
addr2->InsertEndChild(text5);
code2->InsertEndChild(addr2);tinyxml2::XMLElement* repositories = doc.NewElement("Repositories");
tinyxml2::XMLText* text6 = doc.NewText("27");
repositories->InsertEndChild(text6);
code2->InsertEndChild(repositories);#ifdef _MSC_VER
const char* file_name = "C:/Log/test.xml";
#else
const char* file_name = "testdata/test.xml";
#endifret = doc.SaveFile(file_name);
if (ret != 0) {
fprintf(stderr, "fail to save xml file: %s\n", file_name);
return -1;
}return 0;
}int test_tinyxml2_parse()
{
#ifdef _MSC_VER
const char* file_name = "C:/Log/test_tinyxml2.xml";
#else
const char* file_name = "testdata/test_tinyxml2.xml";
#endiftinyxml2::XMLDocument doc;
tinyxml2::XMLError ret = doc.LoadFile(file_name);
if (ret != 0) {
fprintf(stderr, "fail to load xml file: %s\n", file_name);
return -1;
}tinyxml2::XMLElement* root = doc.RootElement();
fprintf(stdout, "root element name: %s\n", root->Name());// User
tinyxml2::XMLElement* user = root->FirstChildElement("User");
if (!user) {
fprintf(stderr, "no child element: User\n");
return -1;
}
fprintf(stdout, "user name: %s\n", user->Attribute("Name"));tinyxml2::XMLElement* blog = user->FirstChildElement("Blog");
if (!blog) {
fprintf(stderr, "no child element: Blog, in User\n");
return -1;
}
fprintf(stdout, "blog value: %s\n", blog->GetText());
fprintf(stdout, "code value: %s\n\n", user->FirstChildElement("Code")->GetText());// Blog
tinyxml2::XMLElement* blog2 = root->FirstChildElement("Blog");
if (!blog2) {
fprintf(stderr, "no child element: Blog\n");
return -1;
}
fprintf(stdout, "blog name: %s\n", blog2->Attribute("Name"));tinyxml2::XMLElement* addr = blog2->FirstChildElement("Address");
if (!addr) {
fprintf(stderr, "no child element: Address, in Blog\n");
return -1;
}
fprintf(stdout, "address value: %s\n", addr->GetText());
fprintf(stdout, "id value: %s\n\n", blog2->FirstChildElement("ID")->GetText());// Code
tinyxml2::XMLElement* code = root->FirstChildElement("Code");
if (!code) {
fprintf(stderr, "no child element: Code\n");
return -1;
}
fprintf(stdout, "code name: %s\n", code->Attribute("Name"));tinyxml2::XMLElement* addr2 = code->FirstChildElement("Address");
if (!addr2) {
fprintf(stderr, "no child element: Address, in Code\n");
return -1;
}
fprintf(stdout, "address value: %s\n", addr2->GetText());
fprintf(stdout, "repositories value: %s\n\n", code->FirstChildElement("Repositories")->GetText());return 0;
}int test_tinyxml2_Modify()
{
#ifdef _MSC_VER
const char* file_name = "C:/Log/test_tinyxml2.xml";
#else
const char* file_name = "testdata/test_tinyxml2.xml";
#endiftinyxml2::XMLDocument doc;
tinyxml2::XMLError ret = doc.LoadFile(file_name);
if (ret != 0) {
fprintf(stderr, "fail to load xml file: %s\n", file_name);
return -1;
}tinyxml2::XMLElement* root = doc.RootElement();
fprintf(stdout, "root element name: %s\n", root->Name());// User
tinyxml2::XMLElement* user = root->FirstChildElement("User");
if (!user) {
fprintf(stderr, "no child element: User\n");
return -1;
}
user->SetAttribute("Age", 20);
user->SetAttribute("Name", "ABCD");tinyxml2::XMLElement* blog = user->FirstChildElement("Blog");
if (!blog) {
fprintf(stderr, "no child element: Blog, in User\n");
return -1;
}
if (0 == strcmp("CSDN", blog->GetText()))
{
blog->SetText("csdn2");
}
doc.SaveFile(file_name);
return 0;
}int main()
{
test_tinyxml2_create();
test_tinyxml2_parse();
test_tinyxml2_Modify();
}
更多相关内容 -
tinyxml2 包装器:tinyxml2_wrap - MATLAB 数组的 XML 序列化/反序列化-matlab开发
2021-05-29 10:05:44可以处理: - 实数和复数矩阵:标量、一维、二维、ND 阵列- 结构数组- 单元阵列- 函数句柄- 结构/细胞的嵌套不支持:对象,xml属性(用于类型和大小) 用法: tinyxml2_wrap('save', 文件名, 变量) tinyxml2_wrap('... -
已编译好的tinyxml2库.rar
2021-07-12 20:44:29使用时包含tinyxml2.h、tinyxml2.cpp即可,也可调用动态库~ -
基于tinyxml2的xml操作库再封装
2019-08-23 09:42:47对tinyxml2再封装,使使用更加便捷,方便。******************************* -
TinyXML2使用示例
2019-04-10 10:58:10TinyXML2使用示例,xml格式的文件,代码根据node节点的获取对象的内容,简单的示例,可以在这个基础上面做对应的修改 -
tinyxml2 (TinyXML-2)
2021-06-22 18:11:43TinyXML-2 最新版 v9.0.0 ,2021-06-22 更新。 TinyXML-2 是 TinyXML-1的更好替代,两者API类似,但使用更少内存,更快,不像TinyXML-1依赖于STL ... -
TinyXML2 官方文档.rar
2019-06-27 16:46:58TinyXML2(C++) 库的官方文档 TinyXML is a simple, small, C++ XML parser that can be easily integrated into other programs. -
tinyxml2最新版附加增删改查demo
2017-12-12 13:07:51TinyXML2是简单实用的开源C++ XML文件解析库,可以很方便的应用到现有的项目之中。TinyXML1与TinyXML2这两个著名的开源XML文件解析库均出自Lee Thomason之手。本文件是提取作者最新上传的文件,并添加了一个增删改查... -
TinyXML2是一个简单,小型,高效的C ++ XML解析器,可以轻松地集成到其他程序中。-C/C++开发
2021-05-26 20:32:09母版托管在github上:https://github.com/leethomason/tinyxml2这些文档的在线HTML版本:http://leethomason.github.io/tinyxml2/示例位于HTML的“相关页面”选项卡中文档。 它能做什么。 简而言之,TinyXML-2解析... -
tinyxml2解析和创建xml样例
2017-06-02 10:54:16实现tinyxml2解析和创建xml,包括解析和创建CDATA区段数据,元素多属性解析与创建 -
tinyxml2解压可直接使用,不能用你@我
2018-08-20 16:12:58官方的tinyxml你下载下来是不能正常使用的,因为缺少stdint.h这个头文件.我这个压缩包里包含了有偿下载的stdint.h和inttypes.h两个头文件,所以收费高点(光是这两个头文件就不止4分了) -
tinyxml与tinyxml2
2014-09-19 15:44:26tinyxml与tinyxml2两个版本的源码,操作xml很方便,解压可以直接使用. -
tinyxml2+示例代码+介绍文档
2015-09-26 11:22:38资源包含2015.9.23从官网下载的tinyxml2的源码和自己编写的示例代码还有介绍文档,容易上手。官网的示例代码和文档晦涩难懂,才自己整理。 -
tinyxml2第三方Xml解析库
2020-10-24 14:41:22C++第三方Xml解析库,亲测好用,在这里免费提供给大家,将会配有使用此库读取Xml代码示例,大家可到博客中搜索“C++之tintxml2库读取Xml示例”。 -
tinyxml2.rar
2020-12-27 23:26:45tinyXml库 -
TinyXML2简单使用例程
2018-12-20 11:50:12TinyXML2简单使用例程,包含xml的创建与读写,元素嵌套使用等情况,代码简单明了,注释清晰,以供参考 -
build-tinyxml2.zip
2020-03-04 14:53:37开源代码cmake编译,vs2013 tinyxml2.lib tinyxml2.dll xml解析库 -
tinyxml2解析XML文件读取数据
2014-08-01 11:18:29利用tinyxml2解析XML读取数据 此工程为本人测试tinyxml2解析XML读取数据的效率进行的一个小测试程序 -
C++ XML 库 TinyXML2 的基本使用
2020-08-12 00:36:55TinyXML-2 是一个简单,小型,高效的 C ++ XML 解析器,可以轻松集成到其他程序中,直接引用源文件的话只需要包含两个文件(h 和 cpp,此外还有个测试文件里面带有 demo)。 TinyXML-2 解析 XML 文档,并以此为基础...0.前言
TinyXML-2 是一个简单,小型,高效的 C ++ XML 解析器,可以轻松集成到其他程序中,直接引用源文件的话只需要包含两个文件(h 和 cpp,此外还有个测试文件里面带有 demo)。
TinyXML-2 解析 XML 文档,并以此为基础构建可读取,修改和保存的文档对象模型(DOM)。文档说,在解释 XML 时仅使用 UTF-8 ,假定所有 XML 为 UTF-8 (看了下使用 MSVC 编译器时生成的 XML 文件文本编码使用的本地编码)。该库还支持打印到文件或内存,使用 XMLPrinter 类。
GitHub 链接:https://github.com/leethomason/tinyxml2
(在线文档我的网访问不了,但是下载库 GitHub 上的项目后带有离线文档,用谷歌浏览器在线翻译即可)
1.基本使用
引入头文件:
#include "tinyxml2.h" //tinyxml2的类在tinyxml2命名空间 using namespace tinyxml2;
使用 XMLDocument 加载和保存 XML 文件:
//构造一个xml文档类 XMLDocument doc; //读取文件 //从磁盘加载XML文件。成功返回XML_SUCCESS(0),或者返回errorID。 XMLError error = doc.LoadFile(xmlPath); //也可以解析字符串 //XMLError tinyxml2::XMLDocument::Parse(const char *xml,size_t nBytes = static_cast<size_t>(-1)); if (error != XMLError::XML_SUCCESS) return; //存储到文件,参数2 compact紧凑默认false doc.SaveFile(xmlPath);
可以借助 XMLDocument 生成节点(元素、属性、文本、注释等),也可以直接 new 生成对象,但还要使用 Insert 方法才能插入到结构中:
//元素 XMLElement * tinyxml2::XMLDocument::NewElement (const char *name) //注释 XMLComment * tinyxml2::XMLDocument::NewComment (const char *comment) //文本 XMLText * tinyxml2::XMLDocument::NewText (const char *text) //XML文件头描述 XMLDeclaration * tinyxml2::XMLDocument::NewDeclaration (const char *text=0) //未知类型 XMLUnknown * tinyxml2::XMLDocument::NewUnknown (const char *text) //插入到末尾 XMLNode * tinyxml2::XMLNode::InsertEndChild (XMLNode *addThis) //插入到开头 XMLNode * tinyxml2::XMLNode::InsertFirstChild (XMLNode *addThis) //插入到节点的下一个位置 XMLNode * tinyxml2::XMLNode::InsertAfterChild (XMLNode *afterThis, XMLNode *addThis)
删除子节点:
//删除所有子节点 void tinyxml2::XMLNode::DeleteChildren () //删除指定子节点 void tinyxml2::XMLNode::DeleteChild (XMLNode *node)
对于查找,可通过父子兄弟节点进行遍历:
//是否不包含子节点 bool tinyxml2::XMLNode::NoChildren () const //第一个子节点 const XMLNode * tinyxml2::XMLNode::FirstChild () const //第一个子元素 const XMLElement * tinyxml2::XMLNode::FirstChildElement (const char *name=0) const //最后一个子节点 const XMLNode * tinyxml2::XMLNode::LastChild () const //最后一个子元素 const XMLElement * tinyxml2::XMLNode::LastChildElement (const char *name=0) const //上一个兄弟节点 const XMLNode * tinyxml2::XMLNode::PreviousSibling () const //上一个兄弟元素 const XMLElement * tinyxml2::XMLNode::PreviousSiblingElement (const char *name=0) const //下一个兄弟节点 const XMLNode * tinyxml2::XMLNode::NextSibling () const //下一个兄弟元素 const XMLElement * tinyxml2::XMLNode::NextSiblingElement (const char *name=0) const
如果要遍历整个文档,可从 XMLDocument 开始遍历,XXXChild + XXXSibling 遍历所有的子节点和兄弟节点。
2.简单的示例
第一生成的 XML 结构如下:
<?xml version="1.0" encoding="UTF-8"?> <ElementA Level="A" Value="1992">ElementA text<!--ElementA comment--><ElementB Level="B">ElementB text<!--ElementB comment--></ElementB> </ElementA> <!--My TinyXml2 Test... ...-->Some Test <!Unknown>
第二次生成的 XML 结构如下:
<?xml version="1.0" encoding="UTF-8"?> <Root> <GroupA Type="A"> <Name>中文<Content>111111</Content> </Name> <Name>English<Content>222222</Content> </Name> <Name>123<Content>333333</Content> </Name> </GroupA> <GroupB Type="B"/> <GroupC Type="C"/> </Root>
完整代码:
#include <iostream> #include <string> #include "tinyxml2.h" //tinyxml2的类在tinyxml2命名空间 using namespace tinyxml2; //测试生成xml void create_xml(const char* xmlPath); //测试解析xml void parse_xml(const char* xmlPath); //遍历xml node void traversal_node(XMLNode* node); //遍历xml element void traversal_element(XMLNode* node, int level); //生成预定格式xml void create_xml2(const char* xmlPath); //解析预定义格式xml void parse_xml2(const char* xmlPath); int main() { const char* path = "./test.xml"; create_xml(path); parse_xml(path); const char* path2 = "./test2.xml"; create_xml2(path2); parse_xml2(path2); system("pause"); return 0; } void create_xml(const char* xmlPath) { std::cout << "\ncreate_xml:" << xmlPath << std::endl; //【】构造一个xml文档类 XMLDocument doc; //【】操作文档相关接口 //创建与此文档关联的新声明。对象的内存由文档管理。 //如果'text'参数为null,则使用标准声明: //<?xml version="1.0" encoding="UTF-8"?> XMLDeclaration* declaration = doc.NewDeclaration(); //创建与此文档关联的新元素。元素的内存由文档管理。 XMLElement* element = doc.NewElement("ElementA"); //创建与此文档关联的新注释。注释的内存由文档管理。 XMLComment* comment = doc.NewComment("My TinyXml2 Test... ..."); //创建与此文档关联的新文本。文本的存储由文档管理。 XMLText* text = doc.NewText("Some Test"); //创建与此文档关联的新的未知节点。对象的内存由文档管理。 XMLUnknown* unknown = doc.NewUnknown("Unknown"); //【】创建了节点还要插入文档中 //添加一个子节点作为最后一个(右)子节点。如果子节点已经是文档的一部分,则将其从其旧位置移至新位置。 //XMLNode* tinyxml2::XMLNode::InsertEndChild(XMLNode * addThis); //添加一个子节点作为第一个(左)子节点。如果子节点已经是文档的一部分,则将其从其旧位置移至新位置。 //XMLNode* tinyxml2::XMLNode::InsertFirstChild(XMLNode* addThis); //在指定的子节点之后添加一个节点。如果子节点已经是文档的一部分,则将其从其旧位置移至新位置。 //XMLNode* tinyxml2::XMLNode::InsertAfterChild(XMLNode * afterThis, XMLNode * addThis); doc.InsertFirstChild(declaration); doc.InsertAfterChild(declaration, element); doc.InsertEndChild(comment); doc.InsertEndChild(text); doc.InsertEndChild(unknown); //【】操作节点相关接口 //将命名属性设置为对应类型的value element->SetAttribute("Level", "A"); element->SetAttribute("Value", 1992); //设置文本 element->SetText("ElementA text"); //注释 element->InsertNewComment("ElementA comment"); //添加子节点,接口已经带insert功能了 XMLElement* sub_element = element->InsertNewChildElement("ElementB"); sub_element->SetAttribute("Level", "B"); sub_element->SetText("ElementB text"); sub_element->InsertNewComment("ElementB comment"); //【】存储到文件,参数2 compact紧凑默认false //结构写的不规范,感觉应该拿一个根节点把那些注释,文本包起来 //不然解析的时候没法访问啊 doc.SaveFile(xmlPath); } void parse_xml(const char* xmlPath) { std::cout << "\nparse_xml:" << xmlPath << std::endl; //【】构造一个xml文档类 XMLDocument doc; //【】读取文件 //从磁盘加载XML文件。成功返回XML_SUCCESS(0),或者返回errorID。 XMLError error = doc.LoadFile(xmlPath); //也可以解析字符串 //从字符串解析XML文件。成功返回XML_SUCCESS(0),或者返回errorID。 //XMLError tinyxml2::XMLDocument::Parse(const char *xml,size_t nBytes = static_cast<size_t>(-1)); if (error != XMLError::XML_SUCCESS) return; //注意,实际解析时返回的指针记得判空,不然遇到解析失败异常就遭了 //【】解析根元素 //返回DOM的根元素。等效于FirstChildElement。要获取第一个节点,请使用FirstChild。 XMLElement* root = doc.RootElement(); std::cout << "RootElement name:" << root->Name() << std::endl; //获取第一个子元素,或者选择具有指定名称的第一个子元素。 XMLElement* first = doc.FirstChildElement("ElementA"); //给定一个属性名称,Attribute返回该名称的属性的值;如果不存在,则返回null。 std::cout << "FirstChildElement Attr Level:" << first->Attribute("Level") << std::endl; std::cout << "FirstChildElement Attr Value:" << first->Attribute("Value") << std::endl; //如果'this'的第一个Child是XMLText,则GetText返回Text节点的字符串,否则返回null。 std::cout << "FirstChildElement Text:" << first->GetText() << std::endl; //【】解析子元素 XMLElement* sub = root->FirstChildElement("ElementB"); std::cout << "SubElement Attr Level:" << sub->Attribute("Level") << std::endl; std::cout << "SubElement Text:" << sub->GetText() << std::endl; //【】 //可使用FirstChild+NextSibling遍历子节点 std::cout << "\ntraversal_xml:" << std::endl; traversal_node(&doc); //或者FirstChildElement+NextSiblingElement遍历子元素 std::cout << "\ntraversal_element:" << std::endl; traversal_element(&doc, 0); } void traversal_node(XMLNode* node) { if (!node) return; for (XMLNode* current = node->FirstChild(); current != nullptr; current = current->NextSibling()) { XMLNode* temp = current; if (temp->Value() != nullptr) std::cout << temp->Value() << std::endl; if (!temp->NoChildren()) traversal_node(temp); } } void traversal_element(XMLNode* node, int level) { if (!node) return; for (XMLElement* current = node->FirstChildElement(); current != nullptr; current = current->NextSiblingElement()) { XMLElement* temp = current; //这里我使用点号来表示层级缩进 std::cout << std::string(level * 5, '.') << temp->Name() << std::endl; if (temp->GetText() != nullptr) std::cout << std::string(level * 5, '.') << "> Text" << ":" << temp->GetText() << std::endl; const XMLAttribute* attr = temp->FirstAttribute(); if (attr != nullptr) std::cout << std::string(level * 5, '.') << "> Attr" << ":" << attr->Value() << std::endl; if (temp->FirstChildElement() != nullptr) traversal_element(temp, level + 1); } } void create_xml2(const char* xmlPath) { std::cout << "\ncreate_xml2:" << xmlPath << std::endl; //【】构造一个xml文档类 XMLDocument doc; //【】构建我们的xml数据结构 XMLDeclaration* declaration = doc.NewDeclaration(); doc.InsertFirstChild(declaration); //创建与此文档关联的新元素。元素的内存由文档管理。 XMLElement* root = doc.NewElement("Root"); doc.InsertEndChild(root); //子节点 XMLElement* group_a = root->InsertNewChildElement("GroupA"); group_a->SetAttribute("Type", "A"); XMLElement* a_1 = group_a->InsertNewChildElement("Name"); a_1->SetText("中文"); XMLElement* a_1_sub = a_1->InsertNewChildElement("Content"); a_1_sub->SetText("111111"); XMLElement* a_2 = group_a->InsertNewChildElement("Name"); a_2->SetText("English"); XMLElement* a_2_sub = a_2->InsertNewChildElement("Content"); a_2_sub->SetText("222222"); XMLElement* a_3 = group_a->InsertNewChildElement("Name"); a_3->SetText("123"); XMLElement* a_3_sub = a_3->InsertNewChildElement("Content"); a_3_sub->SetText("333333"); XMLElement* group_b = root->InsertNewChildElement("GroupB"); group_b->SetAttribute("Type", "B"); XMLElement* group_c = root->InsertNewChildElement("GroupC"); group_c->SetAttribute("Type", "C"); //【】存储到文件,参数2 compact紧凑默认false doc.SaveFile(xmlPath); } void parse_xml2(const char* xmlPath) { std::cout << "\nparse_xml2:" << xmlPath << std::endl; //【】构造一个xml文档类 XMLDocument doc; //【】读取文件 //从磁盘加载XML文件。成功返回XML_SUCCESS(0),或者返回errorID。 XMLError error = doc.LoadFile(xmlPath); //也可以解析字符串 //从字符串解析XML文件。成功返回XML_SUCCESS(0),或者返回errorID。 //XMLError tinyxml2::XMLDocument::Parse(const char *xml,size_t nBytes = static_cast<size_t>(-1)); if (error != XMLError::XML_SUCCESS) return; //注意,实际解析时返回的指针记得判空,不然遇到解析失败异常就遭了 //【】解析根节点 //返回DOM的根元素。等效于FirstChildElement。要获取第一个节点,请使用FirstChild。 XMLElement* root = doc.RootElement(); //【】查找 XMLElement* find_ele = root->FirstChildElement("GroupA"); if (find_ele) { std::cout << find_ele->Name() << std::endl; const XMLAttribute* attr = find_ele->FindAttribute("Type"); if (attr) { std::cout << attr->Name() << ":" << attr->Value() << std::endl; } XMLElement* find_sub = find_ele->FirstChildElement("Name"); if (find_sub && find_sub->GetText()) { std::cout << find_sub->GetText() << std::endl; } } //【】遍历 std::cout << "\ntraversal_element:" << std::endl; traversal_element(&doc, 0); }
-
tinyxml2最新版附加demo
2017-12-08 15:11:05TinyXML2是简单实用的开源C++ XML文件解析库,可以很方便的应用到现有的项目之中。TinyXML1与TinyXML2这两个著名的开源XML文件解析库均出自Lee Thomason之手。本文件是提取作者最新上传的文件,并添加了两个示例文件... -
tinyxml2-master.zip
2020-05-12 13:34:52tinyxml2文件,在github上下载的,到目前为止最新的。传上来做个备用,大家可以免费下载啊。 -
tinyxml-cmake:tinyxml 2.6.2使用cmake
2021-03-17 20:33:59建置状态 -
tinyxml2-master.zip解析xml的c++库
2017-10-16 10:59:27tinyxml2库解析xml用是c++的 使用轻快方便只需要库中的tinyxml2.cpp和tinyxml2.h放到开发路径下即可使用,如果编译报错fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory,请下载FFmpeg-... -
C++ XML文件解析库 tinyxml2
2018-07-02 13:51:04TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。 -
TinyXML2_6.0.2使用Demo
2018-06-12 19:43:28TinyXML2_6.0.2简单案例,博客来源https://blog.csdn.net/wfh2015/article/details/80670086。 -
开源库TinyXML2简介及使用
2019-08-17 10:13:15TinyXML2是一个开源、简单、小巧、高效的C++ XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(Document Object Model, DOM)...TinyXML2是一个开源、简单、小巧、高效的C++ XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(Document Object Model, DOM)。它不能解析DTD(Document Type Definitions, 文档类型定义)或XSL(eXtensible Stylesheet Language, 扩展样式表语言)。在TinyXML2中,XML数据被解析为可以浏览和操作的C++对象,然后写入磁盘和其它输出流。它不依赖于C++的STL。
TinyXML2的license为ZLib,可以商用,它的源码在https://github.com/leethomason/tinyxml2 ,最新发布版本为7.1.0。
关于XML的介绍可以参考:https://blog.csdn.net/fengbingchun/article/details/38978591
以下是测试代码(test_tinyxml2.cpp):创建XML(test_tinyxml2_create)和解析XML(test_tinyxml2_parse)
#include "funset.hpp" #include <iostream> #include "tinyxml2.h" int test_tinyxml2_create() { const char* declaration = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; tinyxml2::XMLDocument doc; tinyxml2::XMLError ret = doc.Parse(declaration); if (ret != 0) { fprintf(stderr, "fail to parse xml file: %s\n", declaration); return -1; } tinyxml2::XMLComment* comment = doc.NewComment("this is a xml test file"); doc.InsertEndChild(comment); tinyxml2::XMLElement* root = doc.NewElement("Root"); doc.InsertEndChild(root); // User tinyxml2::XMLElement* user = doc.NewElement("User"); user->SetAttribute("Name", "fengbingchun"); root->InsertEndChild(user); tinyxml2::XMLElement* blog = doc.NewElement("Blog"); tinyxml2::XMLText* text1 = doc.NewText("CSDN"); blog->InsertEndChild(text1); user->InsertEndChild(blog); tinyxml2::XMLElement* code = doc.NewElement("Code"); tinyxml2::XMLText* text2 = doc.NewText("GitHub"); code->InsertEndChild(text2); user->InsertEndChild(code); // Blog tinyxml2::XMLElement* blog2 = doc.NewElement("Blog"); blog2->SetAttribute("Name", "CSDN"); root->InsertEndChild(blog2); tinyxml2::XMLElement* addr = doc.NewElement("Address"); tinyxml2::XMLText* text3 = doc.NewText("https://blog.csdn.net/fengbingchun"); addr->InsertEndChild(text3); blog2->InsertEndChild(addr); tinyxml2::XMLElement* id = doc.NewElement("ID"); tinyxml2::XMLText* text4 = doc.NewText("fengbingchun"); id->InsertEndChild(text4); blog2->InsertEndChild(id); // Code tinyxml2::XMLElement* code2 = doc.NewElement("Code"); code2->SetAttribute("Name", "GitHub"); root->InsertEndChild(code2); tinyxml2::XMLElement* addr2 = doc.NewElement("Address"); tinyxml2::XMLText* text5 = doc.NewText("https://github.com//fengbingchun"); addr2->InsertEndChild(text5); code2->InsertEndChild(addr2); tinyxml2::XMLElement* repositories = doc.NewElement("Repositories"); tinyxml2::XMLText* text6 = doc.NewText("27"); repositories->InsertEndChild(text6); code2->InsertEndChild(repositories); #ifdef _MSC_VER const char* file_name = "E:/GitCode/Messy_Test/testdata/test.xml"; #else const char* file_name = "testdata/test.xml"; #endif ret = doc.SaveFile(file_name); if (ret != 0) { fprintf(stderr, "fail to save xml file: %s\n", file_name); return -1; } return 0; } int test_tinyxml2_parse() { #ifdef _MSC_VER const char* file_name = "E:/GitCode/Messy_Test/testdata/test_tinyxml2.xml"; #else const char* file_name = "testdata/test_tinyxml2.xml"; #endif tinyxml2::XMLDocument doc; tinyxml2::XMLError ret = doc.LoadFile(file_name); if (ret != 0) { fprintf(stderr, "fail to load xml file: %s\n", file_name); return -1; } tinyxml2::XMLElement* root = doc.RootElement(); fprintf(stdout, "root element name: %s\n", root->Name()); // User tinyxml2::XMLElement* user = root->FirstChildElement("User"); if (!user) { fprintf(stderr, "no child element: User\n"); return -1; } fprintf(stdout, "user name: %s\n", user->Attribute("Name")); tinyxml2::XMLElement* blog = user->FirstChildElement("Blog"); if (!blog) { fprintf(stderr, "no child element: Blog, in User\n"); return -1; } fprintf(stdout, "blog value: %s\n", blog->GetText()); fprintf(stdout, "code value: %s\n\n", user->FirstChildElement("Code")->GetText()); // Blog tinyxml2::XMLElement* blog2 = root->FirstChildElement("Blog"); if (!blog2) { fprintf(stderr, "no child element: Blog\n"); return -1; } fprintf(stdout, "blog name: %s\n", blog2->Attribute("Name")); tinyxml2::XMLElement* addr = blog2->FirstChildElement("Address"); if (!addr) { fprintf(stderr, "no child element: Address, in Blog\n"); return -1; } fprintf(stdout, "address value: %s\n", addr->GetText()); fprintf(stdout, "id value: %s\n\n", blog2->FirstChildElement("ID")->GetText()); // Code tinyxml2::XMLElement* code = root->FirstChildElement("Code"); if (!code) { fprintf(stderr, "no child element: Code\n"); return -1; } fprintf(stdout, "code name: %s\n", code->Attribute("Name")); tinyxml2::XMLElement* addr2 = code->FirstChildElement("Address"); if (!addr2) { fprintf(stderr, "no child element: Address, in Code\n"); return -1; } fprintf(stdout, "address value: %s\n", addr2->GetText()); fprintf(stdout, "repositories value: %s\n\n", code->FirstChildElement("Repositories")->GetText()); return 0; }
创建xml文件的执行结果如下:
<?xml version="1.0" encoding="UTF-8"?> <!--this is a xml test file--> <Root> <User Name="fengbingchun"> <Blog>CSDN</Blog> <Code>GitHub</Code> </User> <Blog Name="CSDN"> <Address>https://blog.csdn.net/fengbingchun</Address> <ID>fengbingchun</ID> </Blog> <Code Name="GitHub"> <Address>https://github.com//fengbingchun</Address> <Repositories>27</Repositories> </Code> </Root>
解析以上xml文件输出结果如下:
-
tinyxml2使用
2021-04-09 00:19:57tinyxml2 github地址 本文涵盖了日常编码中会使用tingyxml2库进行的一些操作,包括:解析xml文件或者xml格式内容的字符串、获取xml节点属性与内容、增加节点或属性、删除节点或属性、将doc对象保存为xml文件或者字符...1.概述
tinyxml2 github地址
本文涵盖了日常编码中会使用tinyxml2库进行的一些操作,包括:解析xml文件或者xml格式内容的字符串、获取xml节点属性与内容、增加节点或属性、删除节点或属性、将doc对象保存为xml文件或者字符串、从一个文档拷贝节点到另一个文档中等。
本文以类似svg内容存储的数据来进行实例操作,以下为实例操作涉及到的数据。<?xml version="1.0" encoding="UTF-8"?> <draw width="200" height="100" version="1" original="true" author="FabianD" createtime="2021-04-08"> <geometry id="1"> <line x1="5" y1="5" x2="5" y2="10"/> <circle cx="5" cy="5" r="5"/> </geometry> <remark>势均力敌,才能生生不息</remark> </draw>
2.构造数据并创建xml文件
using namespace tinyxml2; XMLDocument doc;//定义doc对象 //<1.增加xml文档声明 //方式1 const char* declaration="<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; XMLError result = doc.Parse(declaration); //方式2,生成的内容同上 XMLDeclaration* declarationElement = doc.NewDeclaration(); doc.InsertFirstChild(declarationElement); //<2.添加节点 XMLElement* drawElement = doc.NewElement("draw"); doc.InsertEndChild(drawElement); //<3.添加属性并设置属性值 drawElement->SetAttribute("width", 200.0);//double类型 drawElement->SetAttribute("height", 100.0);//double类型 drawElement->SetAttribute("version", 1);//int类型 drawElement->SetAttribute("original", true);//bool类型 std::string author = "FabianD"; drawElement->SetAttribute("author", author.c_str());//const char*类型 drawElement->SetAttribute("createtime", "2021-04-08");//const char*类型 //<4.添加子节点 XMLElement* geometryElement = doc.NewElement("");//暂不设置节点名称 geometryElement->SetName("geometry");//通过SetName函数设置节点名称 geometryElement->SetAttribute("id", 1); drawElement->InsertEndChild(geometryElement); //添加直线节点至geometryElement XMLElement* lineElement = doc.NewElement("line"); lineElement->SetAttribute("x1", 5); lineElement->SetAttribute("y1", 5); lineElement->SetAttribute("x2", 5); lineElement->SetAttribute("y2", 10); geometryElement->InsertEndChild(lineElement); //添加圆节点至geometryElement XMLElement* circleElement = doc.NewElement("circle"); circleElement->SetAttribute("cx", 5); circleElement->SetAttribute("cy", 5); circleElement->SetAttribute("r", 5); geometryElement->InsertEndChild(circleElement); //添加remarkElement至根节点 XMLElement* remarkElement = doc.NewElement("remark"); remarkElement->SetText("势均力敌,才能生生不息");//设置节点内容 drawElement->InsertEndChild(remarkElement); //<5.保存至文件中 result = doc.SaveFile("Draw.xml");//会清除原来文件中的内容
3.解析xml文件并读取数据
using namespace tinyxml2; XMLDocument doc; XMLError result; //<1.加载解析文件 result = doc.LoadFile("Draw.xml"); if (result == XML_SUCCESS) { //<2.获取根节点 XMLElement* drawElement = doc.RootElement();//获取根节点 if (drawElement) { //<3.获取属性值 //方式1 double width = 0; result = drawElement->QueryDoubleAttribute("width", &width); if (result == XML_SUCCESS) { std::cout << "Width:" << width << std::endl; }else { std::cout << "根节点没有width属性" << std::endl; } //方式2 const char* heightPtr = drawElement->Attribute("height"); if (heightPtr) { double height = std::stod(heightPtr);//stod为新特性下的函数 std::cout << "Height:" << height << std::endl; }else { std::cout << "根节点没有height属性" << std::endl; } //方式3 int version = drawElement->IntAttribute("version", 0);//第二个参数为默认返回值,这种方式在找不到属性时会返回默认值,适合确定有属性存在的情况 std::cout << "Version:" << version << std::endl; //获取其他类型属性值 bool original = false; result = drawElement->QueryBoolAttribute("original", &original); if (result == XML_SUCCESS) { std::cout << "Original:" << original << std::endl; } const char* authorPtr = drawElement->Attribute("author"); if (authorPtr) { std::cout << "Author:" << authorPtr << std::endl; } //<4.获取子节点 XMLElement* geometryElement = drawElement->FirstChildElement("geometry");//传入节点名称 if (geometryElement) { XMLElement* childElement = geometryElement->FirstChildElement();//不传入节点名称,返回第一个子节点 //遍历获取子节点 while (childElement) { if (!std::strcmp(childElement->Name(), "line")) { //获取直线节点相关属性 double x1 = childElement->DoubleAttribute("x1"); double y1 = childElement->DoubleAttribute("y1"); std::cout << "LineX1:" << x1 << std::endl; //... }else if (!std::strcmp(childElement->Name(), "circle")) { //获取圆节点相关属性 double cx = childElement->DoubleAttribute("cx"); double cy = childElement->DoubleAttribute("cy"); std::cout << "CircleCx:" << cx << std::endl; //... } childElement = childElement->NextSiblingElement();//获取同一级的下一节点 } } //获取remark子节点 XMLElement* remarkElement = drawElement->FirstChildElement("remark"); if (remarkElement) { const char* remark = remarkElement->GetText();//获取节点内容 std::cout << "Remark:" << remark << std::endl; } //<5.修改节点 //修改节点属性值及内容 if (remarkElement) { remarkElement->SetText("至死不渝"); remarkElement->SetAttribute("type", "love"); } //删除属性及节点 drawElement->DeleteAttribute("version");//删除version属性 geometryElement->DeleteChild(geometryElement->FirstChildElement("line"));//删除line节点 //geometryElement->DeleteChildren();//删除所有子节点 doc.SaveFile("Draw.xml");//重新保存 }else { std::cout << "文件没有根节点" << std::endl; } }else { std::cout << "解析失败:" << result << std::endl; }
4.其他一些操作
using namespace tinyxml2; XMLDocument doc; XMLError result = doc.LoadFile("Draw.xml"); if (result == XML_SUCCESS) { //<1.读取xml文件内容至const char*中 XMLPrinter printer; doc.Print(&printer); const char* contentPtr = printer.CStr(); std::cout << "xml content:" << contentPtr << std::endl; //<2.解析字符串内容 XMLDocument docx; result = docx.Parse(contentPtr); if(result==XML_SUCCESS){ if (docx.RootElement()) { std::cout << docx.RootElement()->Name(); } } //<3.复制doc中的节点到另一个doc中 XMLDocument docTarget; result = docTarget.LoadFile("Draw.xml"); if (result == XML_SUCCESS) { XMLElement* drawElementSource = doc.RootElement(); XMLElement* drawElementTarget = docTarget.RootElement(); if (drawElementTarget) { XMLElement* geometryElementTarget = drawElementTarget->FirstChildElement("geometry"); if (geometryElementTarget) { XMLNode* geometryElementSource = geometryElementTarget->DeepClone(&doc);//复制节点到新doc中 drawElementSource->InsertFirstChild(geometryElementSource);//执行插入操作 result = doc.SaveFile("Draw.xml"); } } } }
5.总结
tinyxml2经常用到的几个对象:
1.tinyxml2::XMLNode:XMLDocment、XMLElement的基类
- XMLNode* InsertFirstChild(XMLNode* node): 在对象(文档/节点)最前面插入节点node。
- XMLNode* InsertEndChild(XMLNode* node): 在对象(文档/节点)最后面插入节点node。
- XMLNode* InsertAfterChild(XMLNode* afterNode,XMLNode* node): 在节点afterNode后面插入节点node。
- void DeleteChild(XMLNode*): 删除子节点node。
- void DeleteChildren(): 删除所有子节点。
- static void DeleteChild(XMLNode*): 删除节点node。
- XMLNode* DeepClone(XMLDocument* target): 拷贝一份数据到target文档中,返回有同样数据的XMLNode*。
- XMLElement* FirstChildElement(const char* name==NULL): 获取对象(文档/节点)下节点名称为name的第一个子节点。
- XMLElement* LastChildElement(const char* name==NULL): 获取对象(文档/节点)下节点名称为name的最后一个子节点。
- XMLNode* Parent(): 获取(文档/节点)的父节点。
- XMLElement* NextSiblingElement(const char* name==NULL): 获取对象(文档/节点)同级中往后名称为name的节点。
- XMLElement* PreviousSiblingElement(const char* name==NULL): 获取对象(文档/节点)同级中往前名称为name的节点。
2.tinyxml2::XMLDocument:
- XMLError LoadFile(const char*): 用来加载解析xml文件。
- XMLError SaveFile(const char*): 用来保存数据至xml文件。
- XMLError Parse(const char*): 用来解析字符串内容。
- XMLDeclaration* NewDeclaration(): 用来创建doc的文档声明,创建后,还需要将其插入XMLDocument对象中才有作用。
- XMLElement* NewElement(): 用来创建doc的节点,创建后,还需要将其插入XMLDocument对象中才有作用。
3.tinyxml2::XMLElement:
- void SetAttribute(const char*, T value): 设置属性,T可以是任意基础类型。
- void SetName( const char* str, bool staticMem=false ): 设置节点名称。
- XMLError QueryIntAttribute( const char* name, int* value ): 获取名称为name,type为int的属性的值,如果该值不是int类型,返回值将不是XML_SUCCESS。同类型的函数还有:QueryDoubleAttribute、QueryBoolAttribute等。
- const char* XMLElement::Attribute( const char* name, const char* value ): 获取名称为name的属性值,如果没有该属性,则返回默认值value。
- int IntAttribute(const char* name, int defaultValue): 获取名称为name的属性值,如果没有该属性,则返回默认值defaultValue。
-
tinyxml2.h tinyxml2.cpp文件
2022-04-07 17:37:49tinyxml2的对应文件zip包 其中包括tinyxml2.h以及tinyxml2.cpp -
tinyxml2最新版本(来自github)
2017-08-17 20:34:14tinyxml2最新版本__20170817 (来自github)