• 利用Xercesc库解析XML


    如下是一个XML文件:sample.xml
    <?xml version="1.0" encoding="utf-8"?>
    <常用XML解析库>
        <库1>Xerces-C</库1>
        <库2>libxml2</库2>
        <库3>expat</库3>
        <库4>tinyxml</库4>
        <库5>msxml</库5>
    </常用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/DOMText.hpp>
    #include <xercesc/parsers/XercesDOMParser.hpp>
    #include <xercesc/util/XMLUni.hpp>
    
    #include <iostream>
    using namespace std;
    
    
    #ifdef _DEBUG
    #pragma comment( lib, "xerces-c_2d.lib" )
    #else
    #pragma comment( lib, "xerces-c_2.lib" )
    #endif
    
    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;
        }
    };
    
    
    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( "sample.xml" );
        xercesc::DOMDocument* xmlDoc = myParser->getDocument();
        xercesc::DOMElement* elementRoot = xmlDoc->getDocumentElement();
    
        if( elementRoot == NULL )
        {
            xercesc::XMLPlatformUtils::Terminate();
            cout << "空文档或文档格式错误!" << endl;
            return 0;
        }
    
        nodeProxy.printNodeContent( elementRoot->getNodeName() );
        cout<<endl;
    
        xercesc::DOMNodeList* children = elementRoot->getChildNodes();
        XMLSize_t nodeCount = children->getLength();
    
        for( XMLSize_t xx = 0; xx < nodeCount; xx++ )
        {
            xercesc::DOMNode* currentNode = children->item(xx);
            if( currentNode->getNodeType() && currentNode->getNodeType() == 
    		xercesc::DOMNode::ELEMENT_NODE )
            {
    
                xercesc::DOMElement* currentElement =
                    (xercesc::DOMElement*)(currentNode);
                cout<<"\t";
                nodeProxy.printNodeContent( currentElement->getTagName() );
                cout<<"\t";
                nodeProxy.printNodeContent(currentNode->getTextContent());
                cout<<endl;
            }
        }
    
        cout<<"\n解析完毕"<<endl;
        xercesc::XMLPlatformUtils::Terminate();
        getchar();
        return 0;
    }
    
  • 相关阅读:
    linux shell
    jsp应用
    JavaScript基础整理(2)
    Struts2验证框架实例
    一个Struts2的实例
    Java继承和多态实例
    VS2010webConfig配置
    html兼容性
    Linux 入门记录:一、命令行 Bash 的基本操作
    微信支付:curl 出错,错误码: 60
  • 原文地址:https://www.cnblogs.com/LinuxHunter/p/1890712.html
Copyright © 2020-2023  润新知