代码如下:
#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;
}