利用TinyXML解析XML

3 篇文章 0 订阅

下载地址: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编码



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值