C++ 写 xml

原创 2012年03月22日 21:59:10
//////////////////////////////////////////////////////////////////////
//
// XMLWrite.h
// 
// Version: V1.0
//
// Author: Dennis, May 2010
// 
// This code is provided "as is", with absolutely no warranty expressed
// or implied. Any use is at your own risk.
//
// History:
// 2011-04-03 Dennis      1.set TAB_SPACE vale 4
//                        2.modify cout statement from "stackTag.top().tag"
//                          to "stackTag.top().tag.c_str()"
//                        3.modify WriteComment function, make sure
//                          comment start with a new line
//////////////////////////////////////////////////////////////////////

#ifndef __KMLWRITE_H__
#define __KMLWRITE_H__

//use for ofstream, fstream use for open file to read/write
#include <fstream>

#include <stack>
using namespace std;

#define INDENT_FIRSTTAG 0	// indent of first tag text
#define TAB_SPACE 4			// number of spaces for Tab key

class XMLWrite
{
public:
	XMLWrite(ostream& _out):out(_out),m_bIsEnter(false),m_bIsText(false){}
	~XMLWrite(void){}

	inline void WriteProlon()
	{
		out<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"<<endl;
		m_bIsEnter = true;
	}

	inline void WriteComment(const char* pComment)
	{
		if (!m_bIsEnter)
		{
			out<<endl;
		}

		out<<"<!--"<<pComment<<"-->"<<endl;
		m_bIsEnter = true;
	}

	void WriteTag(const char* pTag, bool bIsExistAttribute = false)
	{
		if (!m_bIsEnter)
		{
			out<<endl;
		}

		//calculate indent of each tag
		XMLTag tag;
		if (0 == stackTag.size())
		{
			tag.tag = pTag;
			tag.nTabCount = INDENT_FIRSTTAG;
			stackTag.push(tag);
		}
		else
		{
			tag.tag = pTag;
			tag.nTabCount = stackTag.top().nTabCount+TAB_SPACE;
			stackTag.push(tag);
		}

		int nTabCount = 0;
		nTabCount = stackTag.top().nTabCount;
		while (nTabCount-- > 0)
		{
			out<<" ";
		}

		if (bIsExistAttribute)
		{
			out<<"<"<<pTag<<" ";
		}
		else
		{
			out<<"<"<<pTag<<">";
		}
		m_bIsEnter = false;
	}

	void WriteAttribute(const char* pAttributeName, const char* pValue, bool bCloseTag)
	{
		out<<pAttributeName<<"=\""<<pValue<<"\"";
		if (bCloseTag)
		{
			out<<">"<<endl;
			m_bIsEnter = true;
		}
		else
		{
			out<<" ";
		}
	}

	void WriteText(const char* pStr,bool bIsMulti = false)
	{
 		if (bIsMulti)
 		{
			out<<endl;
 			int nTabCount = stackTag.top().nTabCount+TAB_SPACE;
 			while(nTabCount-- > 0)
 			{
 				out<<" ";
 			}
 		}

		m_bIsMulti = bIsMulti;

		out<<pStr;

		m_bIsEnter = false;
		m_bIsText = true;
	}

	//@ nFlag -1:write all end flag, n: write n end flag
	void WriteEndTag(int nNumber = 1)
	{
		//if nNumber=-1, close all end tag
		if (-1 == nNumber)
		{
			nNumber = (int)stackTag.size();
		}

		//if previous string is not text, write enter symbol
		if (!m_bIsText && !m_bIsEnter)
		{
			out<<endl;
		}

		if (stackTag.empty())
		{
			return;
		}

		if (m_bIsMulti)
		{
			out<<endl;
		}

		//write top of stack
		int nTabCount = stackTag.top().nTabCount;
		while (nTabCount-- > 0)
		{
			if (m_bIsText && !m_bIsMulti)
			{
				break;
			}
			out<<" ";
		}
		out << "</" << stackTag.top().tag.c_str() << '>' <<endl;
		stackTag.pop();

		//write remain element
		while (!stackTag.empty() && 0 != --nNumber)
		{
			nTabCount = stackTag.top().nTabCount;
			while (nTabCount-- > 0)
			{
				out<<" ";
			}
			out << "</" << stackTag.top().tag.c_str() << '>' <<endl;
			stackTag.pop();
		}
		
		m_bIsText = false;
		m_bIsEnter = true;
		m_bIsMulti = false;
	}

protected:
private:
	ostream& out;
	
	bool m_bIsEnter;//Check whether the previous character is enter symbol
	bool m_bIsText;	//Check whether the previous string is text
	bool m_bIsMulti;//flag of multi line text

	typedef struct  XMLTag
	{
		string tag;		//name of tag
		int nTabCount;	//count of tab symbols
	} XMLTag;

	stack<XMLTag> stackTag;	//stack of tag
};

#endif


相关文章推荐

C++ XML读写工具-tinyxml

  • 2017年11月09日 09:11
  • 292KB
  • 下载

C++ XML读写

  • 2013年01月25日 15:07
  • 32KB
  • 下载

C++通过TinyXML类库读写XML文件

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树...

c++ XML读写

  • 2012年05月10日 17:48
  • 47KB
  • 下载

c++ 使用TinyXml读写Xml

最近,因为要读取xml找了半天,才弄到TinyXml来读写xml。这个他们评价都还不错,所以就研究了下。不过我,也就是简单学习下。了解不深。 TinyXml的下载之后,文件比较多。其实很多都没有用,...

C++中DOM写XML

  • 2010年06月04日 22:24
  • 115KB
  • 下载

c/c++ XML 读写 tinyXML rapidXML slimXML LibXML XMLBooster squashXML

TinyXml读写xml http://blog.csdn.net/fireway2009/article/details/7322144   linux c xml 读写 h...

C++XML读写封装类

  • 2016年01月25日 10:49
  • 12KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ 写 xml
举报原因:
原因补充:

(最多只允许输入30个字)