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 parsingn 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 parsingn "<< 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,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;; } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |