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

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:一个优秀的C++ XML解析器 

TinyXML Tutorial 中文指南  

关于tinyxml的剖析及遍历 

TinyXML入门教程

posted @ 2011-06-11 17:17  westfly  阅读(1616)  评论(0编辑  收藏  举报