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
TinyXML的测试
官方自带的有个xmltest的程序的。《TinyXML:一个优秀的C++ XML解析器》的代码附带中文支持。
该代码给出了一个简单的示例,对于复杂的XML就得了解细节了。
TinyXML的层次结构
TiXmlNode是很多原始的基类,所以变量的时候为了通用就可以用TiXmlNode来代替。
TinyXML的遍历
示例代码如下
递归版本

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函数

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;
}
参考文章