to myself 的分类学习日志

做自己想做的事
posts - 232, comments - 6, trackbacks - 0, articles - 0

xercesc

Posted on 2011-03-06 22:15 kongkongzi 阅读(1207) 评论(0)  编辑 收藏 引用 所属分类: third
myfile.xml
<level1>
    <level2>
        <name>abc</name>
    </level2>
    <level2>
        <name>xyz</name>
    </level2>
</level1>



#include 
<xercesc/util/PlatformUtils.hpp>
#include 
<xercesc/framework/XMLFormatter.hpp>
#include 
<xercesc/util/XMLString.hpp>
#include 
<xercesc/util/XMLUniDefs.hpp>
#include 
<xercesc/framework/MemBufInputSource.hpp>
#include 
<xercesc/framework/LocalFileInputSource.hpp>
#include 
<xercesc/parsers/XercesDOMParser.hpp>
#include 
<xercesc/dom/DOMNode.hpp>
#include 
<xercesc/dom/DOMNodeList.hpp>
#include 
<stdio.h>
#include 
<iostream>
#include 
<vector>
#include 
<string>

using namespace XERCES_CPP_NAMESPACE;
using namespace std;

int main()
{
    
/* initialise xerces */
    
try
    {
        XMLPlatformUtils::Initialize ();
    }
    
catch (const XMLException & toCatch)
    {
        
char *pMsg = XMLString::transcode (toCatch.getMessage ());
        printf (
"Error during Xerces-c Initialization.\n"
                
"   Exception message: %s", pMsg);
        delete[] pMsg;
        
return -1;
    }

    
/* parse a XML file */
    XercesDOMParser 
*m_DOMParser = new XercesDOMParser();
    m_DOMParser
->setValidationScheme(XercesDOMParser::Val_Always);
//    ErrorHandler *m_ERRHandler = (ErrorHandler*)new HandlerBase();
//    m_DOMParser->setErrorHandler(m_ERRHandler);
    try
    {
        m_DOMParser
->parse("myfile.xml");
    }
    
catch(const XMLException& toCatch) 
    {
        
return -1;
    }

    XMLCh temp[
257];
    DOMNode 
*root = m_DOMParser->getDocument(); // 取得了整个树的根节点
    DOMNodeList* childList = root->getChildNodes(); // 获取所有子节点
    for (int j = 0; j < childList->getLength(); ++j)
    {
        XMLString::transcode(
"level1", temp, 256); // 内部使用UTF-16编码,所以需要转换

        
if (childList->item(j)->getNodeType() == DOMNode::ELEMENT_NODE
            
&& XMLString::compareString(childList->item(j)->getNodeName(), temp) == 0)
        {
            
char *tn = XMLString::transcode(childList->item(j)->getNodeName());
            std::cout 
<< tn << std::endl;

            DOMNode 
*subRoot = childList->item(j);
            DOMNodeList 
*subChildList = subRoot->getChildNodes();
            
for (int k = 0; k < subChildList->getLength(); ++k)
            {
                XMLString::transcode(
"level2", temp, 256); // 内部使用UTF-16编码,所以需要转换

                
if (subChildList->item(k)->getNodeType() == DOMNode::ELEMENT_NODE
                    
&& XMLString::compareString(subChildList->item(k)->getNodeName(), temp) == 0)
                {
                    
char *tn = XMLString::transcode(subChildList->item(k)->getNodeName());
                    std::cout 
<< "\t" << tn << std::endl;

                    DOMNode 
*ssubRoot = subChildList->item(k);
                    DOMNodeList 
*ssubChildList = ssubRoot->getChildNodes();
                    
for (int m = 0; m < ssubChildList->getLength(); ++m)
                    {
                        XMLString::transcode(
"name", temp, 256); // 内部使用UTF-16编码,所以需要转换

                        
if (ssubChildList->item(m)->getNodeType() == DOMNode::ELEMENT_NODE
                            
&& XMLString::compareString(ssubChildList->item(m)->getNodeName(), temp) == 0)
                        {
                            
char *tn = XMLString::transcode(ssubChildList->item(m)->getNodeName());
                            
char *tv = XMLString::transcode(ssubChildList->item(m)->getFirstChild()->getNodeValue());//每个ELEMENT的第一子节点为TEXT_NODE
                            std::cout << "\t\t" << tn << ":" << tv << std::endl; // tv=="abc",
                            XMLString::release(&tn);
                            XMLString::release(
&tv);
                        }
                    }
                }
            }
        }
    }

    XMLPlatformUtils::Terminate();

    
return 0;
}


g++ -g -O2 -msse2 -o DOMPrint src/DOMPrint/DOMPrint.o src/DOMPrint/DOMPrintErrorHandler.o src/DOMPrint/DOMPrintFilter.o src/DOMPrint/DOMTreeErrorReporter.o ../src/.libs/libxerces-c.so -lnsl -lpthread


参考:
1,http://panpan.blog.51cto.com/489034/187272
2,http://blog.csdn.net/wangpeng110m/archive/2009/05/14/4181668.aspx


遇到的错误:
1,xml文件本身有问题,结束标签忘记写“/“。