微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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,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;;

}

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类