利用TinyXML解析XML

前端之家收集整理的这篇文章主要介绍了利用TinyXML解析XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

下载地址:TinyXML

解压缩TinyXML后,找到六个文件

tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp

将这六个文件放在你的C++工程中,跟你的源文件在同一目录下。

新建一个XML文件,命名为PhoneBookData.xml :

<?xml version="1.0" encoding="utf-8"?>
<phonebook>
 <!--one item behalfs one contacted person.-->
 <item>
  <name>Richard</name>
  <addr>DongXiang</addr>
  <tel>13500000000</tel>
  <email>Richard@gmail.com</email>
 </item>
 <item>
  <name>Amanda</name>
  <addr>JinXian</addr>
  <tel>15011111111</tel>
  <email>Amanda@gmail.com</email>
 </item>
 <!--more contacted persons.-->


</phonebook>


该XML文件对应的树为:


TinyXML中主要class的类图:


TinyXML中主要类和XML文件之间的对应关系:

TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...</...>包括内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性



新建一个C++文件,用于解析PhoneBookData.xml :(C++文件,XML文件,以及之前六个文件,都是在同一目录下)

C++文件包含两个头文件:#include "tinyxml.h" 和 #include "tinystr.h" 便可使用TinyXMl了

#include <iostream>
#include "tinystr.h"
#include "tinyxml.h"
using namespace std;

void main()
{

	TiXmlDocument doc("phonebookdata.xml");  
	doc.LoadFile();  

	//获得根元素,即phonebook  
	TiXmlElement* root = doc.RootElement();  

	printf("_______________________________________\n\n");  
	printf("     contacted person information      \n\n");  
	// trace every items below root.  
	for( TiXmlNode*  item = root->FirstChild( "item" ); item; item = item->NextSibling( "item" ) ) //NextSibling是指下一个兄弟结点
	{  
		printf("_______________________________________\n");  

		//读取name
		TiXmlNode* child = item->FirstChild();  
		const char* name = child->ToElement()->GetText();  
			printf("name:%s\n",name);  

		//读取address.  
		child=item->IterateChildren(child);
		const char* addr = child->ToElement()->GetText();  
			printf("addr:%s\n",addr);  

		//读取tel 
		child = item->IterateChildren(child);  
		const char* tel = child->ToElement()->GetText();  
			printf("tel:%s\n",tel);  

		//读取email.  
		child = item->IterateChildren(child);  
		const char* email = child->ToElement()->GetText();  
			printf("email:%s\n",email);  

		printf("\n");  

	}  


	system("pause");
}


解析结果为:



给XML添加信息

	// Add information to xml file and save it.  
	TiXmlElement* writeRoot = doc.RootElement();  
	TiXmlNode* newNode = new TiXmlElement("item");  
		  
	const TiXmlNode* nameNewNode = new TiXmlElement("name");  
	newNode->InsertEndChild(*nameNewNode)->InsertEndChild(TiXmlText("pipi"));  
		  
	const TiXmlNode* addrNewNode = new TiXmlElement("addr");  
	newNode->InsertEndChild(*addrNewNode)->InsertEndChild(TiXmlText("Shaanxi Xianyang"));  
		  
	const TiXmlNode* telNewNode = new TiXmlElement("tel");  
	newNode->InsertEndChild(*telNewNode)->InsertEndChild(TiXmlText("02937310627"));  
		  
	const TiXmlNode* emailNewNode = new TiXmlElement("email");  
	newNode->InsertEndChild(*emailNewNode)->InsertEndChild(TiXmlText("pipi@home.com"));  
		  
	writeRoot->InsertEndChild(*newNode);  
	doc.SaveFile(); 


XML文件变化为:

<?xml version="1.0" encoding="utf-8" ?>
<phonebook>
    <!--one item behalfs one contacted person.-->
    <item>
        <name>Richard</name>
        <addr>DongXiang</addr>
        <tel>13500000000</tel>
        <email>Richard@gmail.com</email>
    </item>
    <item>
        <name>Amanda</name>
        <addr>JinXian</addr>
        <tel>15011111111</tel>
        <email>Amanda@gmail.com</email>
    </item>
    <!--more contacted persons.-->
    <item>
        <name>pipi</name>
        <addr>Shaanxi Xianyang</addr>
        <tel>02937310627</tel>
        <email>pipi@home.com</email>
    </item>
</phonebook>

该XML文件对应的树为:



中文乱码问题:

XML文件使用的是UTF-8编码,而Windows下的控制台默认使用gb2312编码

原文链接:https://www.f2er.com/xml/298623.html

猜你在找的XML相关文章