DOM解析XML文档

代码如下:
#include <windows.h>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMDocumentType.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/dom/DOMImplementationLS.hpp>
#include <xercesc/dom/DOMNodeIterator.hpp>
#include <xercesc/dom/DOMNodeList.hpp>
#include <xercesc/dom/DOMNamedNodeMap.hpp>
#include <xercesc/dom/DOMText.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
#include <xercesc/util/XMLUni.hpp>

#include <iostream>
using namespace std;

#pragma comment( lib, "xerces-c_3D.lib" )


class CXMLNodeContent
{
private:
	char* m_pNodeText;
	int m_BufferSize;
	int m_CurBufferSize;
public:
	CXMLNodeContent()
	{
		m_pNodeText = NULL;
		m_BufferSize = 0;
		m_CurBufferSize = 0;
	}

	~CXMLNodeContent()
	{
		if( m_pNodeText != NULL )
		{
			delete []m_pNodeText;
			m_pNodeText = NULL;
		}

		m_BufferSize = 0;
		m_CurBufferSize = 0;
	}

	int printNodeContent( const XMLCh* pText )
	{
		getNodeContent( pText );
		if( m_CurBufferSize == 1 )
			return 0;
		else
		{
			printf( "%s", m_pNodeText );
			return 1;
		}
	}

	int getBufferSize()
	{
		return m_CurBufferSize;
	}

	char* getNodeContent( const XMLCh* pText )
	{
		if( pText == NULL )
		{
			m_CurBufferSize = 0;
			return NULL;
		}

		int index = 0;
		m_CurBufferSize = WideCharToMultiByte(CP_ACP, 0 ,pText, -1 ,
			0 , 0, NULL, NULL);
		if( pText[0] == 10 )
		{
			while( pText[index] == 10 || pText[index] == 32 && index < m_CurBufferSize )
				index++;
			if( index == m_CurBufferSize )
			{
				m_CurBufferSize = 0;
				return NULL;
			}
		}

		if( m_CurBufferSize > m_BufferSize )
		{
			if( m_pNodeText == NULL )
			{
				m_pNodeText = new char[m_CurBufferSize];
				m_BufferSize = m_CurBufferSize;
			}

			else
			{
				delete []m_pNodeText;
				m_pNodeText = new char[m_CurBufferSize];
				m_BufferSize = m_CurBufferSize;
			}
		}

		WideCharToMultiByte(CP_ACP, 0 ,pText + index, -1 ,
			m_pNodeText , m_CurBufferSize, NULL, NULL);
		return m_pNodeText;
	}
};
char* XMLch2char( const XMLCh* pText )
{
	int m_CurBufferSize = 0;
	int m_BufferSize = 0;
	char *m_pNodeText = NULL;
	if( pText == NULL )
	{
		return NULL;
	}

	int index = 0;
	m_CurBufferSize = WideCharToMultiByte(CP_ACP, 0 ,pText, -1 ,
		0 , 0, NULL, NULL);
	if( pText[0] == 10 )
	{
		while( pText[index] == 10 || pText[index] == 32 && index < m_CurBufferSize )
			index++;
		if( index == m_CurBufferSize )
		{
			m_CurBufferSize = 0;
			return NULL;
		}
	}

	if( m_CurBufferSize > m_BufferSize )
	{
		if( m_pNodeText == NULL )
		{
			m_pNodeText = new char[m_CurBufferSize];
			m_BufferSize = m_CurBufferSize;
		}

		else
		{
			delete []m_pNodeText;
			m_pNodeText = new char[m_CurBufferSize];
			m_BufferSize = m_CurBufferSize;
		}
	}

	WideCharToMultiByte(CP_ACP, 0 ,pText + index, -1 ,
		m_pNodeText , m_CurBufferSize, NULL, NULL);
	return m_pNodeText;
}

int main()
{
	CXMLNodeContent nodeProxy;
	xercesc::XMLPlatformUtils::Initialize();
	xercesc::XercesDOMParser* myParser = new xercesc::XercesDOMParser;
	//myParser->setValidationScheme( xercesc::XercesDOMParser::Val_Auto );
	myParser->setDoNamespaces( false );
	myParser->setDoSchema( false );
	myParser->setLoadExternalDTD( false );
	myParser->parse("definition.xml");
	// get document
	xercesc::DOMDocument* xmlDoc = myParser->getDocument();
	// get root node
	xercesc::DOMElement* elementRoot = xmlDoc->getDocumentElement();

	if( elementRoot == NULL )
	{
		xercesc::XMLPlatformUtils::Terminate();
		cout << "空文档或文档格式错误!" << endl;
		return 0;
	}

	nodeProxy.printNodeContent( elementRoot->getNodeName() );
	cout<<endl;
	// get sons
	xercesc::DOMNodeList* children = elementRoot->getChildNodes();
	XMLSize_t nodeCount = children->getLength();

	for( XMLSize_t xx = 0; xx < nodeCount; xx++ )
	{
		xercesc::DOMNode* currentNode = children->item(xx);
		int nt = currentNode->getNodeType();
		const XMLCh *cont = currentNode->getTextContent();
		const XMLCh *cont2 = currentNode->getNodeValue();
		// get attributes
		xercesc::DOMNamedNodeMap * attrList = currentNode->getAttributes();
		if (NULL != attrList)
		{
			XMLSize_t attrCount = attrList->getLength();
			xercesc::DOMAttr *tmpAttr = (xercesc::DOMAttr *)attrList->item(0);
			cout<<XMLch2char(tmpAttr->getName())<<":"<<XMLch2char(tmpAttr->getValue())<<endl;
		}
		// get son's sons
		xercesc::DOMNodeList *grandsons = currentNode->getChildNodes();
		XMLSize_t grandCount = grandsons->getLength();
		if( currentNode->getNodeType() && currentNode->getNodeType() == 
			xercesc::DOMNode::ELEMENT_NODE )
		{
			/*currentNode->getAttributes()*/
			xercesc::DOMElement* currentElement =
				(xercesc::DOMElement*)(currentNode);
			cout<<"\t";
			nodeProxy.printNodeContent( currentElement->getTagName() );
			//DOMNamedNodeMap * lstAttr = currentElement->getAttributes()
			//XMLSize_t attrCount = lstAttr->getLength();
			//cout<<"\t"; 
			//for (XMLSize_t i = 0; i < attrCount; i++)
			//{
			//	cout<<lstAttr->item(i)->getNodeName()<<":"<<lstAttr->item(i)->getNodeValue()<<endl;
			//}
			cout<<"\t";
			nodeProxy.printNodeContent(currentNode->getTextContent());
			cout<<endl;
		}
	}

	cout<<"\n解析完毕"<<endl;
	xercesc::XMLPlatformUtils::Terminate();
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值