`

使用TinyXml解析Xml示例

阅读更多

// TestXml.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include "tinyxml.h"
#include "lang.h"
#include <string>
using namespace std;
using namespace std;

#pragma comment(lib, "tinyxmld.lib")

BOOL LoadXml(TiXmlDocument&doc, LPCTSTR lpszSrcPath);
BOOL SaveXml(TiXmlDocument&doc, LPCTSTR lpszDstPath);
BOOL GetDeclare(TiXmlDocument&doc);
BOOL ReadXmlText(TiXmlDocument&doc);
BOOL ParseXmlText(TiXmlElement* pEleRoot);

BOOL ReadXmlAttr(TiXmlDocument&doc);
BOOL ParseXmlAttr(TiXmlElement* pEleRoot);

BOOL AddNode(TiXmlDocument& doc);
BOOL DelNode(TiXmlDocument& doc);

int _tmain(int argc, _TCHAR* argv[])
{
	TiXmlDocument doc;

	//load xml
	if (!LoadXml(doc, "./test_copy.xml"))
	{
		return -1;
	}
	//get declare
	GetDeclare(doc);

	//add and del
	DelNode(doc);
	AddNode(doc);
	
	
	cout << "============================Read Text==========================" << endl;
	//read text
	ReadXmlText(doc);

    cout << "============================Read Attribute==========================" << endl;
	//read attribute
    ReadXmlAttr(doc);


	if (!SaveXml(doc, "./test2.xml"))
	{
		return -1;
	}

	return 0;
}

BOOL LoadXml(TiXmlDocument&doc, LPCTSTR lpszSrcPath)
{
	//load file
	if (!doc.LoadFile(lpszSrcPath))
	{
		cout << "load xml failed!" << endl;
		return FALSE;
	}

	//print
	doc.Print();

	return TRUE;
}

BOOL SaveXml(TiXmlDocument&doc, LPCTSTR lpszDstPath)
{
	//save file
	if (!doc.SaveFile(lpszDstPath))
	{
		cout << "save xml failed!" << endl;
	}
	else
	{
		cout << "save xml succ!" << endl;
	}

	return TRUE;
}

BOOL GetDeclare(TiXmlDocument&doc)
{
	TiXmlNode* pXmlFirst = doc.FirstChild();

	if (NULL != pXmlFirst)
	{
		TiXmlString str;
		TiXmlDeclaration* pXmlDec = pXmlFirst->ToDeclaration();
		if (NULL == pXmlDec)
		{
			pXmlDec->Print(0, 1, &str);

			//cout << "szDecInfo:" << str << endl;
			cout << "szVer:" << pXmlDec->Version() << " is absolute:" << pXmlDec->Standalone() << "code type:" << pXmlDec->Encoding() << endl;
		}
		
		return TRUE;
	}

	return FALSE;
}

BOOL ReadXmlText(TiXmlDocument&doc)
{
	//get root pointer
	TiXmlElement* pXmlRoot = doc.RootElement();
	if (NULL == pXmlRoot)
	{
		return FALSE;
	}

	TiXmlNode* pParent = pXmlRoot->Parent();
	TiXmlNode* pChild = pXmlRoot->FirstChild();
	
	return ParseXmlText(pXmlRoot);
}

BOOL ParseXmlText(TiXmlElement* pEleRoot)
{
	if (NULL == pEleRoot)
	{
		return FALSE;
	}

	TiXmlElement* pEle = NULL;
	
	for (pEle = pEleRoot->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement())
	{
		cout << "\t";

		//递归处理
		ParseXmlText(pEle);

		const char* pszText = pEle->GetText();

		if (NULL != pszText)
		{
			cout <<  pszText;
		}

		cout << endl;
	}


	return TRUE;
}

BOOL ReadXmlAttr(TiXmlDocument&doc)
{
	//get root
	TiXmlElement* pEleRoot = doc.RootElement();
	if (NULL == pEleRoot)
	{
		return FALSE;
	}

	return ParseXmlAttr(pEleRoot);
}

BOOL ParseXmlAttr(TiXmlElement* pEleRoot)
{
	if (NULL == pEleRoot)
	{
		return FALSE;
	}

	TiXmlElement* pEle = pEleRoot;
	TiXmlAttribute* pAttr = NULL;

	cout << "\t";
	
	//print owner info
	cout << "node:" << pEle->Value();

	for (pAttr = pEle->FirstAttribute(); pAttr; pAttr = pAttr->Next())
	{
		cout << "\t"; 
		cout << "attr:" << pAttr->Name() << "\t val:" << pAttr->Value() << "\t";
	}

	cout << endl;

	for (pEle = pEleRoot->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement())
	{
		cout << "\t";
		//递归处理子节点
		ParseXmlAttr(pEle);
	}

	return TRUE;
}

BOOL AddNode(TiXmlDocument& doc)
{
	TiXmlElement node("aaa");

	node.SetValue("add node");
	doc.InsertEndChild(node);

	return TRUE;
}

BOOL DelNode(TiXmlDocument& doc)
{
	doc.Clear();

	return TRUE;
}
 
分享到:
评论

相关推荐

    XML解析示例项目-读取并输出xml的指定内容示例

    该项目演示了TinyXML的引入与使用,适合于首次接触xml解析的初学者。(这是自己第一次接触xml解析,所以仅涉及几个基本函数的使用,内容较为简单) 本项目包含了以下几个文件: run_test.sh shell文件,清理当前...

    tinyxml2第三方Xml解析库

    C++第三方Xml解析库,亲测好用,在这里免费提供给大家,将会配有使用此库读取Xml代码示例,大家可到博客中搜索“C++之tintxml2库读取Xml示例”。

    tinyxml2最新版附加demo

    TinyXML2是简单实用的开源C++ XML文件解析库,可以很方便的应用到现有的项目之中。TinyXML1与TinyXML2这两个著名的开源XML文件解析库均出自Lee Thomason之手。本文件是提取作者最新上传的文件,并添加了两个示例文件...

    TinyXML2是一个简单,小型,高效的C ++ XML解析器,可以轻松地集成到其他程序中。-C/C++开发

    TinyXML-2 TinyXML-2是一个简单,小型,高效的C ++ XML解析器,可以轻松地集成到其他程序中。 主机托管在github上:https://github.com/leethomason/tinyxml2这些TinyXML-2的在线HTML版本TinyXML-2是一个简单,小型...

    tinyxml2:TinyXML2是一个简单,小型,高效的C ++ XML解析器,可以轻松集成到其他程序中

    TinyXML-2 TinyXML-2是一个简单,小型,高效的C ++ XML解析器,可以轻松地集成到其他程序中。 主机托管在github上: : 这些文档的在线HTML版本: : 示例在HTML文档的“相关页面”选项卡中。它能做什么。 简而言之,...

    tinyxml(c++的XML解析器)

    功能强大的c++的XML解析器, &lt;br&gt;推荐下载, 源码+示例

    XML解析器Tiny.xml.zip

    tiny.xml 是应用在浏览器里的XML解析器,只有1.6kb大小。暂时不支持Node.js,如果你想让其支持Node.js,可以参看这里。安装npm安装npm install tiny.xml直接从CDN获取使用&lt;!-- Unminified 3.3KB --&gt; ...

    简单使用tinyXml

    这是我从sourceforge上下载的XML解析软件,说实在的,不是很好用。我分别在win32和linux系统下写了编译脚本,并且从新写了一个示例程序,里面做了简单的注释.如果有兴趣,可以下载看看,看有没有什么问题.

    C++读入XML文件示例

    在百度上搜“C++读取Xml文件”,可以出来很多博客,大多数是关于tinyXml的,所以这篇博文也是讲述如何用tinyXML来读取XML文件。 tinyXml是一个免费开源的C++库,可以到官网上下载:...

    libtmx-parser:C ++ TMX文件解析器-读取平铺的地图编辑器文件

    返回一个充满地图数据的结构轻的使用TinyXML2 解析XML,CSV或Base64层(尚无压缩) 易于加入项目去做单元/覆盖测试解析压缩图层图块数据解析地形检查NULL并报告某些“必需”属性的错误编译中有关示例,请参见...

Global site tag (gtag.js) - Google Analytics