Xerces解析XML

今天学习一下用XercesDOMParser  解析XML。简单的实现了自定义的类XdomParser,分别用DOMNodeIterator和DOMTreeWalker实现对DOM树的遍历输出。这里仅是为了简单理解XercesDOMParser 的用法,至于它具体支持的属性以后再仔细研究。

 

class XDomParser

{

public:

       XDomParser(string xmlFilePath = "");

       ~XDomParser();

 

       voidParser(string xmlFilePath = "");

       voidPrint();

       voidPrint(DOMElement *pElement);

       voidPrintByIterator(DOMNode *pNode);

       voidPrintByTreeWalker(DOMNode *pNode);

       DOMElement *GetRootElement();

protected:

private:

       string            m_filePath;

       XercesDOMParser  *m_pParser;

       DOMElement *      m_pRoot;

};

 

 

XDomParser::XDomParser(string xmlFilePath /*= ""*/):m_filePath(xmlFilePath)

{

       m_pParser = newXercesDOMParser;

}

 

XDomParser::~XDomParser()

{

       deletem_pParser;

}

//解析XML

void XDomParser::Parser(string xmlFilePath /*= ""*/ )

{

       try

       {

              if(m_filePath.length())

              {

                     m_pParser->parse(m_filePath.c_str());

              }

              elseif(xmlFilePath.length())

              {

                     m_pParser->parse(xmlFilePath.c_str());

              }

             

       }

       catch (const OutOfMemoryException&)

       {

              XERCES_STD_QUALIFIER cerr <<"OutOfMemoryException" <<XERCES_STD_QUALIFIER endl;

          return;

       }

       catch (const XMLException& e)

       {

              XERCES_STD_QUALIFIER cerr <<"An error occurred during parsing\n   Message: "<<XERCES_STD_QUALIFIERendl;

              return;

       }

 

       catch (const DOMException& e)

       {

              constunsigned intmaxChars = 2047;

              XMLCh errText[maxChars + 1];

              XERCES_STD_QUALIFIER cerr <<"\nDOM Error during parsing: '"<< m_filePath << "'\n"<<endl;

 

              if(DOMImplementation::loadDOMExceptionMsg(e.code, errText, maxChars))

                     XERCES_STD_QUALIFIER cerr<< "Message is: " <<XMLString::transcode(errText) << XERCES_STD_QUALIFIER endl;

          return;

       }

       catch(...)

       {

              XERCES_STD_QUALIFIER cerr <<"An error occurred during parsing\n "<< XERCES_STD_QUALIFIER endl;

        return;

       }

       DOMDocument *pdoc =m_pParser->getDocument();

       m_pRoot = pdoc->getDocumentElement();          //获取XML根节点

}

 

void XDomParser::Print()

{

       if(m_pRoot)

       {

              if(m_pRoot)

              {

                     DOMNodeList*pVersionEleList = m_pRoot->getElementsByTagName(XMLString::transcode("Name"));   //获取Name节点

                     for(int i = 0; i < pVersionEleList->getLength();++i)

                     {

                            DOMNode *pNode =pVersionEleList->item(i);

                            cout<<XMLString::transcode(pVersionEleList->item(i)->getNodeName())<<" value :"<<XMLString::transcode(pVersionEleList->item(i)->getTextContent());

                     }

              }

       }

}

//输出pElement及其子节点

void XDomParser::Print(DOMElement *pElement )

{

       if(pElement)

       {

              DOMElement *pChild =pElement->getFirstElementChild();

              for(pChild ; pChild ;pChild = pChild->getNextElementSibling())

              {

                     intchildCount = pChild->getChildElementCount();

                     string tagName =XMLString::transcode(pChild->getNodeName());

                      if(pChild->getChildElementCount())

                     {

                            cout<<XMLString::transcode(pChild->getNodeName())<<endl;                                    Print(pChild);

                     }

                      else

                      {

                                    cout<<XMLString::transcode(pChild->getNodeName())<<" value :"<<XMLString::transcode(pChild->getTextContent())<<endl;

                      }

                    

              }

       }

}

 

 

DOMElement* XDomParser::GetRootElement()

{

   returnm_pRoot;

}

//用DOMNodeIterator实现遍历XML

voidXDomParser::PrintByIterator(DOMNode *pNode)

{

       DOMDocument *pdoc =m_pParser->getDocument();

       DOMNodeIterator*pIterator=pdoc->createNodeIterator(pNode, DOMNodeFilter::SHOW_ALL, NULL, true);

       DOMNode *pChild =pIterator->getRoot();

       for(pChild; pChild; pChild = pIterator->nextNode())

       {

              string tagName =XMLString::transcode(pChild->getNodeName());

              if((pChild->getNodeType()== DOMNode::ELEMENT_NODE))

              {

                     DOMElement* pElement = static_cast<DOMElement*>(pChild);

                            cout<<XMLString::transcode(pElement->getTagName())<<" value :"<<XMLString::transcode(pElement->getTextContent())<<endl;;

                    

              }

       }

}

//用DOMTreeWalker实现遍历XML

voidXDomParser::PrintByTreeWalker(DOMNode *pNode)

{

       cout<<XMLString::transcode(static_cast<DOMElement*>(pNode)->getTagName())<<endl;

       DOMDocument *pdoc =m_pParser->getDocument();

       string tagName =XMLString::transcode(m_pRoot->getNodeName());

       DOMTreeWalker*pInnerWalker=pdoc->createTreeWalker(pNode, DOMNodeFilter::SHOW_ALL, NULL, true);

       DOMNode *pChild =pInnerWalker->firstChild();

       pChild = pInnerWalker->nextNode();

       for(pChild; pChild; pChild = pInnerWalker->nextNode())

       {

               string tagName =XMLString::transcode(pChild->getNodeName());

               if((pChild->getNodeType() ==DOMNode::ELEMENT_NODE))

                     {

                            DOMElement* pElement= static_cast<DOMElement*>(pChild);

                            if (pElement->getChildElementCount())

                            {

                                   PrintByTreeWalker(pChild);

                            }

                             else

                             {

                                    cout<<XMLString::transcode(pElement->getTagName())<<" value :"<<XMLString::transcode(pElement->getTextContent())<<endl;;

                             }

                     }

       }

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值