TinyXML2 使用

TinyXML2

TinyXML2
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。
这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

在TinyXML中,根据XML的各种元素来定义了一些类:

XmlBase:整个TinyXML模型的基类。
XmlAttribute:对应于XML中的元素的属性。
XmlNode:对应于DOM结构中的节点。
XmlComment:对应于XML中的注释。
XmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
XmlDocument:对应于XML的整个文档。
XmlElement:对应于XML的元素。
XmlText:对应于XML的文字部分。
XmlUnknown:对应于XML的未知部分。 
XmlHandler:定义了针对XML的一些操作。   

Demo

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "tinyxml2.h"
#include <iostream>


using namespace tinyxml2;
using namespace std;

bool createXml(const char* savepath)
{
	XMLDocument *doc = new XMLDocument;
	XMLDeclaration *declaration = doc->NewDeclaration("xml version=\"1.0\" encoding=\"UTF-8\"");
	doc->LinkEndChild(declaration);

	XMLElement *School = doc->NewElement("School");
	doc->LinkEndChild(School);
	School->SetAttribute("name","机械工程学院");

	XMLElement *Class = doc->NewElement("Class");
	School->LinkEndChild(Class);
	Class->SetAttribute("name","c++");

	XMLElement *Student = doc->NewElement("Student");
	Class->LinkEndChild(Student);
	Student->SetAttribute("name","天霸");
	Student->SetAttribute("number", "01");

	XMLElement *Email = doc->NewElement("Email");
	Student->LinkEndChild(Email);
	XMLText * email = doc->NewText("TB@126.com");
	Email->LinkEndChild(email);

	XMLElement *Address = doc->NewElement("Address");
	Student->LinkEndChild(Address);
	XMLText * address = doc->NewText("中国辽宁");
	Address->LinkEndChild(address);

	XMLElement *Student_1 = doc->NewElement("Student");
	Class->LinkEndChild(Student_1);
	Student_1->SetAttribute("name", "动霸");
	Student_1->SetAttribute("number", "02");

	XMLElement *Email_1 = doc->NewElement("Email");
	Student_1->LinkEndChild(Email_1);
	XMLText * email_1 = doc->NewText("DB@126.com");
	Email_1->LinkEndChild(email_1);

	XMLElement *Address_1 = doc->NewElement("Address");
	Student_1->LinkEndChild(Address_1);
	XMLText * address_1 = doc->NewText("中国香港");
	Address_1->LinkEndChild(address_1);


	if (XML_SUCCESS != doc->SaveFile(savepath)) {
		delete doc;
		return false;
	}

	delete doc;
	return true;
}

bool readXml(const char* filename)
{
	XMLDocument doc;
	if (XML_SUCCESS != doc.LoadFile(filename)) {
		return false;
	}

	XMLElement *School = doc.RootElement();
	if (School){
		cout << "School:" << School->Attribute("name") << endl;

		XMLElement *Class = School->FirstChildElement("Class");
		while (Class) {
			cout << "	Class:" << Class->Attribute("name") << endl;

			XMLElement *Student = Class->FirstChildElement("Student");
			while (Student) {
				cout << "		Student:" << Student->Attribute("name") << ", " << Student->Attribute("number") << endl;

				XMLElement* Email = Student->FirstChildElement("email");
				if (Email){
					cout << "		Email:" << Student->GetText() << endl;
				}
				XMLElement* Address = Student->FirstChildElement("address");
				if (Address){
					cout << "		Address:" << Address->GetText() << endl;
				}
				Student = Student->NextSiblingElement("Student");
			}

			Class = Class->NextSiblingElement();
		}

	}
}


int main()
{
	char * path = "d:/tmp.xml";
	createXml(path);
	readXml(path);
    return 0;
}

posted @ 2019-09-09 13:34  youngliu91  阅读(1830)  评论(0编辑  收藏  举报