精华内容
下载资源
问答
  • 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:54
    TinyXml下载链接: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:09
    tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,可以满足绝大部分功能需要。而且它使用很简单,只需要拷贝六个文件到你的工程中就可以使用了。
  • 最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。 TinyXML是一个开源的解析XML的...
  • TinyXML使用方法

    2020-09-23 11:15:53
    TinyXML是一个C++的XML解析,网上的评价都不错,是一个轻量级的XML解析。关于TinyXML使用的文章有很多,而且官方也有完整的文档,这里只是简单把自己使用记录写下来,方便以后查阅。       一...

    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:26
    vs2019引入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的路径改为绝对路径即可。如下图。即可正常使用。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQ9NlhQu-1642125076305)(C:\Users\cfreeze\Desktop\5.png)]

    展开全文
  • tinyxml库C++使用

    2018-11-13 19:57:23
    tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,使用很简单,简单简单很简单真的很简单
  • TinyXML2是一个开源、简单、小巧、高效的C++ XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(Document Object Model, DOM)...
  • C++(TinyXml)的安装和使用

    千次阅读 2020-05-25 17:12:03
    1,什么是TinyXml 当前,对xml的使用非常广泛,读取和设置xml配置文件是我们最常用的操作。常见C/C++ XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,这些解析器有些是支持多语言的,有些只是...
  • TinyXML2是简单实用的开源的C++XML文件解析,可以很方便的应用到现有的项目之中。 TinyXML2解析器相对TinyXML1在代码上是完全重写,使其更适合于游戏开发中使用。它使用更少的内存,更快,并使用更少的内存分配。 ...
  • XMLElement* 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++)正式名称为ticpp,ticpp是一个使用c++语言封装的全新的基于TinyXML的操作XML的。它使用了模板,异常和错误处理。ticpp(TinyXML++) is a completely new interface to TinyXML that uses MANY of ...
  • 因为不习惯用Windows 下的VS 2010,加上大多数时候是在Linux下编程,所以想把...把下载的tinyxml库解压缩,我这里是解压缩到/opt 目录下3.进入到解压缩目录下,我们会发现Tinyxml在Windows 下是使用微软的VS 来生成的...
  • Cmake链接tinyxml静态

    2020-07-23 14:56:06
    Cmake链接tinyxml静态 之前学习Cmake都是在项目内部生成链接(静态.a 或动态.so),生成后target_link_libraries(xxx libxxx) 就行。但最近使用tinyxml是下载之后先生成.a,再在自己的项目里使用它,有点...
  • 使用C/C++语言结合 tinyxml 去操作解析xml文件,详细展开讲解,看它必学会!
  • C++ TinyXML2使用方法及示例

    千次阅读 2019-05-06 09:57:46
    TinyXML2是简单实用的开源的C++XML文件解析,可以很方便的应用到现有的项目之中。  TinyXML2解析器相对TinyXML1在代码上是完全重写,使其更适合于游戏开发中使用。它使用更少的内存,更快,并使用更少的内存...
  • 一. 解析方式 xml的2种解析方式(DOM和SAX解析方式):... 根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象 优点:很方便实...
  • TinyXML2使用教程

    2022-03-18 17:54:39
    TinyXML2使用教程 原文转自 http://blog.csdn.net/K346K346/article/details/48750417 1.TinyXML2概述 TinyXML2是simple、small、efficient开源的C++ XML文件解析,可以很方便的应用到现有的项目之中。非常适合...
  • TinyXML用法小结

    2017-10-25 22:20:00
    TinyXML用法小结 TinyXML用法小结 1. 介绍 Tinyxml的官方网址:http://www.grinninglizard.com 官方介绍文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html 在TinyXML中,根据XML的各种元素...
  • TinyXML2.rar

    2015-03-14 13:27:19
    C++轻量XML文件解析!用于C++项目中进行XML文件的读取和创建!使用方法见本人blog!
  • tinyxml2使用

    2017-11-08 09:16:52
    TinyXML2概述TinyXML2是simple、small、efficient开源的C++ XML文件解析 优点:(1)对大部分的C/C++项目具有普适性。(2)使用较少的内存,...使用方法:将tinyxml2.cpp和tinyxml2.h拷贝至项目目录,使用时包含#in
  • tinyxml2的使用说明

    2021-03-17 21:09:52
    tinyxml2的使用说明 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:19
    1、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 五、查询 六、更新 七、删除 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,869
精华内容 2,347
关键字:

tinyxml库的用法