zoukankan      html  css  js  c++  java
  • 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入门教程

  • 相关阅读:
    [洛谷 U68862] 奶牛滑迷宫 题解
    STL的妙用(二)——洛谷 P2073 送花
    平衡树 x 01-trie √
    最小生成树(大纲,待补全)
    单源最短路算法
    黑科技:如何提高整数域内高斯消元的精度和速度——高斯消元与辗转相除法的结合
    Scratch的入门笔记
    Ubuntu18.04安装Tensorflow
    Ubuntu18.04安装英伟达显卡驱动
    macOS下appstore提示未能完成该操作的解决办法
  • 原文地址:https://www.cnblogs.com/westfly/p/2078429.html
Copyright © 2011-2022 走看看