tinyxml试用指南

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的层次结构

tinyxml试用指南

TiXmlNode是很多原始的基类,所以变量的时候为了通用就可以用TiXmlNode来代替。

TinyXML的遍历

示例代码如下

递归版本


tinyxml试用指南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函数
tinyxml试用指南tinyxml试用指南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:一个优秀的C++ XML解析器

TinyXML Tutorial 中文指南

关于tinyxml的剖析及遍历

TinyXML入门教程
原文链接: https://www.cnblogs.com/westfly/archive/2011/06/11/2078429.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/27087

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午4:40
下一篇 2023年2月8日 上午4:40

相关推荐