加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Xerces解析XML

发布时间:2020-12-15 23:03:05 所属栏目:百科 来源:网络整理
导读:今天学习一下用XercesDOMParser 解析XML。简单的实现了自定义的类XdomParser,分别用DOMNodeIterator和DOMTreeWalker实现对DOM树的遍历输出。这里仅是为了简单理解XercesDOMParser的用法,至于它具体支持的属性以后再仔细研究。 class XDomParser { public :

今天学习一下用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;;

}

}

}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读