-
2020-08-12 00:36:55
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); }
更多相关内容 -
TinyXml库 使用方法
2018-05-02 21:29:54TinyXml下载链接:https://pan.baidu.com/s/1kXiTFSF使用TinyXML只需要将其中的6个文件拷贝到项目中就可以直接使用了,这六个文件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、...TinyXml下载链接:https://pan.baidu.com/s/1kXiTFSF
使用TinyXML只需要将其中的6个文件拷贝到项目中就可以直接使用了,这六个文件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp;
TinyXml类介绍:
XmlBase:整个TinyXML模型的基类;
XmlAttribute:对应于XML中的元素的属性;
XmlComment:对应于XML中的注释;
XmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>;
XmlDocument:对应于XML的整个文档;
XmlDocument:对应于XML的整个文档;
XmlText:对应于XML的文字部分;
XmlUnknown:对应于XML的未知部分;
XmlHandler:定义了针对XML的一些操作;
备注:元素一定是节点,节点不一定是元素;
一:加载XML文件
//加载XML文件
TiXmlDocument doc;
if(!doc.LoadFile("test.xml"))
{
qDebug()<<"加载XML文件失败";
const char *errorStr = doc.ErrorDesc();
qDebug()<<errorStr; //打印失败原因;
}
二:获取XML的根节点
//加载XML文件
TiXmlDocument doc;
if(!doc.LoadFile("test.xml"))
{
qDebug()<<"加载XML文件失败";
const char *errorStr = doc.ErrorDesc();
qDebug()<<errorStr; //打印失败原因;
}
else
{
//获取根节点元素
TiXmlElement *root = doc.FirstChildElement();
}
三:常用方法
TiXmlDocument doc;
doc.LoadFile("test.xml");
TiXmlElement *root = doc.FirstChildElement(); //获取根节点元素
QString ElementName = root->Value(); //获取元素名
bool Children = root->NoChildren(); //判断该元素是否有子元素 返回true 有,false 没有
TiXmlElement *child = root->FirstChildElement(); //获取root元素下的第一个子元素
child = root->FirstChildElement("major"); //获取root元素的子元素指定元素名字(major)
TiXmlElement *brother = child->NextSiblingElement(); //获取child元素的下一个兄弟元素
brother = child->NextSiblingElement("specVersion"); //获取child元素的兄弟元素指定元素名字(specVersion)
QString text = brother->GetText(); //获取brother元素的值
TiXmlAttribute *Attribute = brother->FirstAttribute(); //获取brother元素的第一个属性
QString AttributeName = Attribute->Name(); //获取Attribute属性的名字
QString AttributeValue = Attribute->Value(); //获取Attribute属性的值
AttributeValue = brother->Attribute("AttributeName"); //获取brother的属性名为(AttributeName)的值
TiXmlDocument *myDocument = new TiXmlDocument(); //创建一个XML文件
TiXmlDeclaration *pDeclaration=new TiXmlDeclaration("1.0","UTF-8",""); //创建xml文件头(<?xml version="1.0" encoding="UTF-8" ?>)
myDocument->LinkEndChild(pDeclaration); //加入将xml文件头加入文档中
TiXmlElement *BUSINESS=new TiXmlElement("BUSINESS"); //创建一个元素节点
myDocument->LinkEndChild(BUSINESS); //加入BUSINESS元素节点到文档中
TiXmlElement *COUNTRY = new TiXmlElement("COUNTRY"); //创建两个节点
TiXmlElement *PLANET = new TiXmlElement("PLANET");
BUSINESS->LinkEndChild(PLANET); //将新建的节点加到BUSINESS下一级
BUSINESS->LinkEndChild(COUNTRY);
TiXmlText *PLANETtxt = new TiXmlText("one"); //添加节点内的文本
TiXmlText *COUNTRYtxt = new TiXmlText("china");
COUNTRY->LinkEndChild(COUNTRYtxt);
PLANET->LinkEndChild(PLANETtxt);
myDocument->SaveFile("test.xml"); //保存xml
-
tinyxml库文件
2017-09-11 17:36:09tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,可以满足绝大部分功能需要。而且它使用很简单,只需要拷贝六个文件到你的工程中就可以使用了。 -
c++中用TINYXML解析XML文件
2021-01-19 23:56:17最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。 TinyXML是一个开源的解析XML的... -
TinyXML使用方法
2020-09-23 11:15:53TinyXML是一个C++的XML解析库,网上的评价都不错,是一个轻量级的XML解析库。关于TinyXML使用的文章有很多,而且官方也有完整的文档,这里只是简单把自己使用记录写下来,方便以后查阅。 一...TinyXML是一个C++的XML解析库,网上的评价都不错,是一个轻量级的XML解析库。关于TinyXML使用的文章有很多,而且官方也有完整的文档,这里只是简单把自己使用记录写下来,方便以后查阅。
一个XML文档例子:(文章后面会把这个XML当作例子使用)
<!-- test.xml -->
<Persons>
<Person ID="1">
周星星
</Person>
<Person ID="2">
白晶晶
</Person>
</Persons>TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。
使用的时候,只要把tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp 这六个文件导入工程,然后#include ” tinyxml.h”就可以使用。
在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
这些类都是对应XML文件的一些元素,所以最好对XML文件有一些必要的了解。
TinyXML库对字符串可以使用两种编译方式:char * 以及 string 。所以我们在Wince使用的时候需要注意宽字符的转换。
1、将一个文件加载到 TinyXML DOM 中的最简单方法:
1 TiXmlDocument doc( "demo.xml" );
2
3 //注意TiXmlDocument构造方法参数类型是string
4 doc.LoadFile();2、创建XML文件
1 TiXmlDocument doc;
2
3 //xml文件声明部分
4 TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
5
6 //添加新的节点元素
7 TiXmlElement * element = new TiXmlElement( "Hello" );
8
9 //对应Hello节点的值
10 TiXmlText * text = new TiXmlText( "World" );
11
12 //Hello 节点是文本节点,没有子节点
13 element->LinkEndChild( text );
14
15 //把声明和元素添加到文档
16 doc.LinkEndChild( decl );
17 doc.LinkEndChild( element );
18
19 //保存文档,修改过的xml文件一定要调用SaveFile方法保存数据
20 doc.SaveFile( "madeByHand.xml" );3、遍历整个XML文档
XML文档遍历,主要就是把DOM里面的元素、节点、节点属性全部遍历一次。
//首先需要找到根节点,
TiXmlElement * rootElement = doc.RootElement();
//根节点的第一个子节点(根节点、子节点的概念,请看参考资料)
TiXmlElement * firstElement = rootElement->FirstChildElement();然后可以用上面的方法循环查询同一个节点下的子节点,再加上一个递归循环就可以查询所有的节点。具体代码看参考工程里面的例子。具体代码已经封装成函数。TinyXMLCtl.h头文件
我们在Wince里面大部分时候可能都是使用查询XML里面的数据,下面针对给出一个简单的查询功能,然后界面一些TinyXML里面的常用方法。
这是一个简单的遍历查询XML文档的代码,功能是遍历XML文档下根节点下的所有兄弟节点。(如果需要遍历兄弟节点下的子节点,需要加个递归调用就好)
//查找根节点,rootElement就是指向<Persons>元素(看文档刚开始时给出的XML文件)
TiXmlElement * rootElement = doc.RootElement();
//查找根节点下第一个子节点,firstElement 指向第一个<Person>节点
TiXmlElement * firstElement = rootElement->FirstChildElement();
TiXmlElement *nextElement = firstElement;
//我在使用的时候使用了TinyXML的char * 字符编译,所以使用的方法返回的字//符串都是 char * 类型的。
const char *value;
const char *name;
//保存遍历得到的数据
CString temp;
//循环遍历根节点下的兄弟节点
while(nextElement)
{
//取出节点的文本节点内容,第一个Person节点的值是周星星
value = nextElement->GetText();
//取出节点的节点名字,第一个节点是Person
name = nextElement->Value();
//TinyXML里面返回的是char *类型的数据,这里要把它转为宽字符,最简单的方法是//直接转为CString,当然也可以用//MultiByteToWideChar,WideCharToMultiByte这两个微软提供的宽字符转换的//函数进行转换,在TinyXMLCtl.h里面,给出了两个封装的函数,具体请自行查看。
CString mmValue(value);
CString mmName(name);
temp = temp + mmValue + L""+ mmName+L"";
//查找下一个兄弟节点的指针
nextElement = nextElement->NextSiblingElement();
}上面最后temp字符串里面应该存放的是:Person 周星星 Person 白晶晶 。
上面只是一个简单遍历同级兄弟节点的方法,只要掌握这几个常用方法就可以自己拓展出复杂的查询方法。
下面再给出对数据常用的操作方法:增删改查 的简单例子和解析
4、修改XML节点
//下面例子是修改test.xml第一个person节点的值“周星星”改为“星星”
//加载文档到DOM,跟上面一样
TiXmlDocument doc("test.xml");
doc.LoadFile();
//获取一个DOM的句柄,操作XML可以用节点Node、元素Element、或者句柄Handle都可//以。三种操作可以根据实际进行转换,转换方法可以参考官方文档。
TiXmlHandle docHandle( &doc );
//找到要修改的那个节点指针,这里是具体知道节点结构才这么做。实际使用的时候,我们需//要遍历查找一个节点名。在TinyXMLCtl.h头文件给出了实现的方法。下面这句话功能跟//doc.RootElement()效果一样,都是为了找到根节点。
TiXmlElement* DesElement = docHandle.FirstChild("Persons "). ToElement();
//找到该节点的第一个子节点(我们要修改的节点)
TiXmlNode * oldnode = DesElement->FirstChild();
//这里先获取该节点的
const char *ver = DesElement ->GetText();
//新的值,注意字符编码转换问题
string strText=”星星”;
TiXmlText *pValue = new TiXmlText(strText.c_str());
// 首先清除所有文本
pNode->Clear();
//把新文本添加进去,这里只是其中一种修改方法,还可以调用ReplaceChild()方法修改。
pNode->LinkEndChild(pValue);
//一定要保存文件,否则修改无效
doc.SaveFile();5、删除XML节点
节点删除,注意使用两个方法:
RemoveChild( TiXmlNode* removeThis )//方法删除父节点的子节点
RemoveAttribute( const char * name )//方法删除属性值.1 //删除第一个节点Person
2
3 TiXmlDocument doc( "\\Storage Card\\test.xml" );
4
5 doc.LoadFile();
6
7 TiXmlElement * rootElement = doc.RootElement();
8
9 TiXmlElement * firstElement = rootElement->FirstChildElement();
10
11 //删除根节点下的第一个节点
12
13 RemoveChild(firstElement);
14
15 doc.SaveFile();5、新增XML节点
//加载文档
1 TiXmlDocument *pDoc = new TiXmlDocument();
2
3 pDoc->LoadFile(pXMLFile);
4
5 TiXmlElement * rootElement = doc.RootElement();
6
7 TiXmlElement * firstElement = rootElement->FirstChildElement();
8
9
10 string strText=“hello”;
11
12 // 生成子节点:pNewNode
13
14 TiXmlElement *pNewNode = new TiXmlElement(strNodeName.c_str());
15
16 // 设置节点文本,然后插入节点
17
18 TiXmlText *pNewValue = new TiXmlText(strText.c_str());
19
20 pNewNode->LinkEndChild(pNewValue);
21
22 //插入节点
23
24 pNode->InsertEndChild(*pNewNode);
25
26 pDoc->SaveFile(pXMLFile); -
vs2019引入tinyxml库
2022-01-14 17:51:26vs2019引入tinyxml库 一、首先,下载tinyxmlTinyXML download | SourceForge.net到本地,并解压到桌面。 二、打开vs的解决方案管理器,创建一个新的项目(或你正在使用的项目)。 将红框内的两个头文件引入解决...vs2019引入tinyxml库
一、首先,下载tinyxmlTinyXML download | SourceForge.net到本地,并解压到桌面。
二、打开vs的解决方案管理器,创建一个新的项目(或你正在使用的项目)。
将红框内的两个头文件引入解决方案管理器中头文件,四个cpp文件引入源文件。
引入方法,以“头文件”为例”:在解决方案管理器中右击头文件文件夹选择添加现有项,将桌面我们下载的tinyxml文件夹下的两个头文件引入。
然后我们创建一个新文件命名为main.cpp,再引入tinyxml.h和tinystr.h于main.cpp中即可,最后如下图:
但是我在这里出现了找不到头文件的报错。
在这里只需要将tinyxml.h的路径改为绝对路径即可。如下图。即可正常使用。
-
tinyxml库C++使用
2018-11-13 19:57:23tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,使用很简单,简单简单很简单真的很简单 -
c/c++操作xml库-Tinyxml2入门及高级用法
2022-05-07 11:20:05TinyXML2是一个开源、简单、小巧、高效的C++ XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(Document Object Model, DOM)... -
C++库(TinyXml)的安装和使用
2020-05-25 17:12:031,什么是TinyXml 当前,对xml的使用非常广泛,读取和设置xml配置文件是我们最常用的操作。常见C/C++ XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,这些解析器有些是支持多语言的,有些只是... -
TinyXML2使用方法及示例
2019-04-10 11:00:59TinyXML2是简单实用的开源的C++XML文件解析库,可以很方便的应用到现有的项目之中。 TinyXML2解析器相对TinyXML1在代码上是完全重写,使其更适合于游戏开发中使用。它使用更少的内存,更快,并使用更少的内存分配。 ... -
TinyXML2 使用方法及示例
2021-05-21 07:41:32XMLElement* gender = doc.NewElement( "Gender...XMLText* genderText=doc.NewText( "man");gender->InsertFirstChild(genderText);userNode->InsertFirstChild(gender);XMLElement* mobile = doc.NewElement... -
使用TinyXml
2021-06-04 05:38:16使用TinyXml的两种方法。第一,导入所需的头文件和cpp文件TinyXml由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、... -
【C++】TinyXML读取xml文件用法详解
2022-03-19 15:06:46提示:文章写完后,目录可以自动...TinyXML是个解析库,它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlp. -
ticpp(TinyXML++)TinyXML的C++封装介绍
2021-05-25 00:40:40ticpp(TinyXML++)正式名称为ticpp,ticpp是一个使用c++语言封装的全新的基于TinyXML的操作XML的库。它使用了模板,异常和错误处理。ticpp(TinyXML++) is a completely new interface to TinyXML that uses MANY of ... -
Linux 下配置Tinyxml,将其编译为静态库
2021-05-13 06:11:27因为不习惯用Windows 下的VS 2010,加上大多数时候是在Linux下编程,所以想把...把下载的tinyxml库解压缩,我这里是解压缩到/opt 目录下3.进入到解压缩目录下,我们会发现Tinyxml在Windows 下是使用微软的VS 来生成的... -
Cmake链接tinyxml静态库
2020-07-23 14:56:06Cmake链接tinyxml静态库 之前学习Cmake都是在项目内部生成链接库(静态库.a 或动态库.so),生成后target_link_libraries(xxx libxxx) 就行。但最近使用tinyxml是下载之后先生成.a,再在自己的项目里使用它,有点... -
C/C++ 使用 tinyxml库 操作XML格式文件(创建、插入、删除、修改、解析)
2022-01-03 13:32:17使用C/C++语言结合 tinyxml 去操作解析xml文件,详细展开讲解,看它必学会! -
C++ TinyXML2使用方法及示例
2019-05-06 09:57:46TinyXML2是简单实用的开源的C++XML文件解析库,可以很方便的应用到现有的项目之中。 TinyXML2解析器相对TinyXML1在代码上是完全重写,使其更适合于游戏开发中使用。它使用更少的内存,更快,并使用更少的内存... -
xml解析库对比总结(解析方式,第三方库,TinyXml)
2019-04-19 08:26:03一. 解析方式 xml的2种解析方式(DOM和SAX解析方式):... 根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象 优点:很方便实... -
TinyXML2使用教程
2022-03-18 17:54:39TinyXML2使用教程 原文转自 http://blog.csdn.net/K346K346/article/details/48750417 1.TinyXML2概述 TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合... -
TinyXML用法小结
2017-10-25 22:20:00TinyXML用法小结 TinyXML用法小结 1. 介绍 Tinyxml的官方网址:http://www.grinninglizard.com 官方介绍文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html 在TinyXML中,根据XML的各种元素... -
TinyXML2.rar
2015-03-14 13:27:19C++轻量XML文件解析库!用于C++项目中进行XML文件的读取和创建!使用方法见本人blog! -
tinyxml2库的使用
2017-11-08 09:16:52TinyXML2概述TinyXML2是simple、small、efficient开源的C++ XML文件解析库 优点:(1)对大部分的C/C++项目具有普适性。(2)使用较少的内存,...使用方法:将tinyxml2.cpp和tinyxml2.h拷贝至项目目录,使用时包含#in -
tinyxml2的使用说明
2021-03-17 21:09:52tinyxml2的使用说明 tinyxml2安装 推荐使用vcpkg进行安装,关于vcpkg如何安装? 参考 https://docs.microsoft.com/zh-cn/cpp/build/install-vcpkg?view=msvc-160&tabs=macos#to-copy-and-set-up-vcpkg-on-... -
使用TinyXml库解析XML文件(QT 源码)
2018-02-06 11:30:08#include #include ...#include "tinyxml.h" //添加头文件 /*QT5.9.1 + MSVC2015*/ using namespace std; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //打开xml文件 TiXm -
tinyxml动态库生成和使用
2016-10-19 17:28:191、xml默认是生成执行文件,要想生成动态库需要修改makefile 从http://ncu.dl.sourceforge.net/sourceforge/tinyxml/tinyxml_2_4_0.tar.gz下载tinyxml,可以根据自己的需要,选择不同的... tar -xzvf tinyxml_2_ -
C++使用TinyXML解析XML
2020-11-18 15:26:37 使用开源库TinyXML解析XML文件,TinyXML能够在windows或linux中编译,使用TinyXML只需要将其中的6个文件拷贝到项目中就可以直接使用了,这六个文件是:tinyxml.h、tinystr.h、tinyxml.cpp、tinystr.cpp、... -
VC++ 2019 MFC TinyXML2使用教程/方法详解
2021-08-15 12:45:37一、创建MFC项目 MFCTinyxml2 应用程序类型选择“基于对话框” 主框架样式仅选择“粗框架”,其他样式无需选择 高级功能处全部全部不要选 ...三、创建XML 四、读取XML 五、查询 六、更新 七、删除 ...