TinyXML是目前非常流行的一款基于DOM模型的XML解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作,其主页是:http://www.grinninglizard.com/tinyxml/
TinyXML的使用
TinyXML直接引用到工程中即可,如果想做成链接库的形式。可以修改Makefile
具体方法为
1.OUTPUT := xmltest一行修改为:OUTPUT := libtinyxml.a 2.将xmltest.cpp从变量SRCS中删除,并注释掉xmltest.o:tinyxml.h tinystr.h。因为不需要将演示程序添加到动态库中。 在${OUTPUT}: ${OBJS}:下添加${AR} $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}。
或者在shell下直接用命令
ar -rcs libtinyxml.a tinyxmlparser.o tinyxmlerror.o tinyxml.o tinystr.o
当然,如果知道原理,你也可以直接修改Makefile的内容。
TinyXML的测试
官方自带的有个xmltest的程序的。《TinyXML:一个优秀的C++ XML解析器》的代码附带中文支持。
该代码给出了一个简单的示例,对于复杂的XML就得了解细节了。
TinyXML的层次结构
TiXmlNode是很多原始的基类,所以变量的时候为了通用就可以用TiXmlNode来代替。
TinyXML的遍历
示例代码如下
递归版本
View Code
BOOL ParseXmlText(TiXmlElement* pEleRoot) { if (NULL == pEleRoot) { return FALSE; } TiXmlElement* pEle = NULL; for (pEle = pEleRoot->FirstChildElement(); pEle; pEle = pEle->NextSiblingElement()) { cout << "t"; //递归处理 ParseXmlText(pEle); const char* pszText = pEle->GetText(); if (NULL != pszText) { cout << pszText; } cout << endl; } return TRUE; }
*TinyXML的方法总结*
请参考TinyXML入门教程
关于CDATA数据域的解析
CDATA的介绍参考《XML CDATA》,简单来说,CDATA区段以 <![CDATA[ 开始,以 ]]> 结束,CDATA区段中的文本不会被XML解析器解析。如何让通过tinyxml获取CDATA中的内容,网上给出了两种方案,文章《用TinyXml解析XML文件中的CDATA区段数据 》是一种间接的方式。具体来说,假设pProperty的包含CDATA域的节点,通过语句
std::string strCDATA = pProperty->FirstChild()->Value();
来得到XML中CDATA域的内容。注意此处如果编码不正确的话,tinyxml会跳过解析,输出的为乱码。
但是此种方法只会保存第一个节点的CDATA域,对于其它的域就没有任何办法了。所以有了终极解决方案。
文章《增强tinyxml对<![CDATA[ ]]>的数据获取》给出了第二种方式————修改tinyxml的源码(看起来蛮有技术含量的哦),它带来了GetText的统一,无论是不是CDATA域,都可以通过GetText来获取文本。
具体实现如下
修改tinyxml.h,在TiXmlElement的private 域增加元素
TiXmlString m_strCData; //非指针
修改tinyxml的GetText函数
View Code
const char* TiXmlElement::GetText() const{ TiXmlString *strCData = (TiXmlString *)&m_strCData; strCData->clear(); const TiXmlNode* child = this->FirstChild(); if ( child ) { const TiXmlText* childText = child->ToText(); if(childText->cdata) { while(child) { strCData->append(child->Value(),child->value.length()); child = child->next; } return m_strCData.c_str(); } if ( childText ) { return childText->Value(); } } return 0;}
参考文章
TinyXML入门教程
原文链接: https://www.cnblogs.com/westfly/archive/2011/06/11/2078429.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/27087
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!