zoukankan      html  css  js  c++  java
  • tinyxml使用指导

    http://blog.csdn.net/bingxuebage/article/details/5853989

     
     

    TinyXML是一个简单小巧,可以很容易集成到其它程序中的C++ XML解析器。

    它能做些什么

    简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。

    XML的意思是“可扩展标记语言“(eXtensible Markup Language)。它允许你创建你自己的文档标记。在为浏览器标记文档方面HTML做得很好,然而XML允许你定义任何文档标记,比如可以为一个组织者应用程序定义一个描述“to do”列表的文档。 XML拥有一个结构化并且方便的格式,所有为存储应用程序数据而创建的随机文件格式都可以用XML代替,而这一切只需要一个解析器。

    最全面正确的说明可以在http://www.w3.org/TR/2004/REC-xml-20040204/找到,但坦白地说,它很晦涩难懂。事实上我喜欢http://skew.org/xml/tutorial上关于XML的介绍。

    有不同的方法可以访问和与XML数据进行交互。TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。

    TinyXML被设计得容易快速上手。它只有两个头文件和四个cpp文件。只需要把它们简单地加到你的项目中就行了。有一个例子文件——xmltest.cpp来引导你该怎么做。

    TinyXML以Zlib许可来发布,所以你可以在开源或者商业软件中使用它。许可证更具体的描述在每个源代码文件的顶部可以找到。

    TinyXML在保证正确和恰当的XML输出的基础上尝试成为一个灵活的解析器。TinyXML可以在任何合理的C++适用系统上编译。它不依赖于异常或者运行时类型信息,有没有STL支持都可以编译。TinyXML完全支持UTF-8编码和前64k个字符实体(<i>译注:如果你不明白这句译文,可能你需要了解一下Unicode编码</i>)。

    它无法做些什么

    TinyXML不解析不使用DTDs(文档类型定义)或者XSLs(可扩展样式表语言)。有其它解析器(到www.sourceforge.org搜索一下XML)具有更加全面的特性,但它们也就更大,需要花更长的时间来建立你的项目,有更陡的学习曲线,而且经常有一个更严格的许可协议。如果你是用于浏览器或者有更复杂的XML需要,那么TinyXML不适合你。

    下面的DTD语法在TinyXML里是不做解析的:

    <!DOCTYPE Archiv [
    <!ELEMENT Comment (#PCDATA)>
    ]>

    因为TinyXML把它看成是一个带着非法嵌入!ELEMENT结点的!DOCTYPE结点。或许这在将来会得到支持。

    指南

    有耐性些,这是一份能很好地指导你怎么开始的指南,它(非常短小精悍)值得你花时间完整地读上一遍。

    元素类

    元素为一个容器类,它具有元素名称,并可以包含其它元素,文本,注释和未知节点,这些对象统称为元素的节点,即节点可以为元素、文本、注释和未知节点类型。元素也可以包含任意个数的属性。

    我们还是以如下的XML代码来说明这个类的功能。

    <element attribute="this a attribute(这是一个属性)" int= "1" float = "3.14">

         <subelement1>

             This a text(这是一个文本)

         </subelement1>

         <subelement2/>

         <subelement3/>

         <subelement4/>    

    </element>

    节点名

    在上方元素的代码中,element为根元素的名称,你可以通过如下的函数来设置和返回它。

    +const std::string& ValueStr() const

    +void SetValue( const std::string& _value )

    父节点

    subelement1,subelement2,subelement3,subelement4都是element的子元素,如果当前元素对象的指针指向subelement1,subelement2,subelement3,subelement4,你可以通过Parent()函数来返回指向element对象的指针,Parent()函数的声明如下:

    +TiXmlNode* Parent()

    子节点

    通过父节点的指针,你可以遍历所有的子节点。

    +TiXmlNode* FirstChild()

    +TiXmlNode* FirstChild( const std::string& _value )

    上面两个函数用于返回第一个子节点对象的指针,带参数名的那个函数表示返回第一个名为_value的子节点。

    +TiXmlNode* LastChild()

    +TiXmlNode* LastChild( const std::string& _value )

    上面的两个函数用于返回最后一个节点对象的指针,带参数名的那个函数表示返回最后一个名为_value的子节点。

    你也可以使用IterateChildren()函数来依次遍历所有的节点,它们的函数声明如下:

    +TiXmlNode* IterateChildren( const TiXmlNode* previous )

    +TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous )

    带参数名的那个函数表示只遍历同名的节点。

    编辑子节点

    你可以插入、删除替换所有的子节点。

    +TiXmlNode* InsertEndChild( const TiXmlNode& addThis );

    +TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );

    +TiXmlNode* InsertAfterChild(  TiXmlNode* afterThis, const TiXmlNode& addThis );

    上面三个函数用于插入节点,InsertEndChild函数让你把新节点插入到末尾,InsertBeforeChildInsertAfterChild函数允许你在指定的节点位置前后插入节点。

    +TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );

    ReplaceChild函数用于替换指定的节点。

    +bool RemoveChild( TiXmlNode* removeThis );

    RemoveChild函数让你删除指定的节点。

    void Clear();

    Clear函数会删除本节点的所有子节点(包括子节点包含的从子节点),但不会修改本节点。

    同级节点

    <element attribute="this a attribute(这是一个属性)" int= "1" float = "3.14">

         <subelement1>

             This a text(这是一个文本)

         </subelement1>

         <subelement2/>

         <subelement3/>

         <subelement4/>    

    </element>

    在上面的xml代码中,subelement1、subelement2、subelement3、subelement4都属于同级节点,我们也提供了相关的函数用于在这些同级节点中遍历。

    +TiXmlNode* PreviousSibling()

    +TiXmlNode* PreviousSibling( const std::string& _value )

    可以根据当前的节点,返回上一个节点的指针。带参数名的那个函数表示返回上一个名为_value的节点。

    当然你也可以根据当前的节点,返回下一个节点的指针。带参数名的那个函数表示返回下一个名为_value的节点。

    +TiXmlNode* NextSibling()

    +TiXmlNode* NextSibling( const std::string& _value)

    遍历元素

    元素是一种特殊的节点,以’<’为开始字符,后接元素名称。函数NextSiblingElement用于返回下一个同级元素,而忽略其它类型的节点。它们的函数声明如下:

    +TiXmlElement* NextSiblingElement()

    +TiXmlElement* NextSiblingElement( const std::string& _value)

    带参数名的那个函数表示返回下一个名为_value的同级元素。

    本类也提供了相关的函数,让你返回第一个子元素。

    +TiXmlElement* FirstChildElement()

    +TiXmlElement* FirstChildElement( const std::string& _value )

    带参数名的那个函数表示返回下一个名为_value的子元素。

    元素属性

    属性一般保存在元素中,它们为使用“=”号连接的两个字符串,左边的表示属性名,等号右边的表示属性值,通常使用字符串、整数和浮点数等数据类型表示。例如,pi = 3.14。

    你可以通过如下的函数,返回属性值。

    +const std::string* Attribute( const std::string& name ) const;

    +const std::string* Attribute( const std::string& name, int* i ) const;

    +const std::string* Attribute( const std::string& name, double* d ) const;

    在上面3个函数中,第一个函数使用字符串保存返回的属性值,第二个函数把属性值转换为整数然后返回,第三个函数把属性值转换为浮点数然后返回。不过,第二、三个函数都会以字符串的形式记录属性值,并作为函数的返回值返回。

    另外,你也可以使用模板函数:

    +template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const

    来返回特点的属性值,它会根据你传入的参数,自动选择合适数据类型。

    另外,本类也提供了如下三个函数让你设置属性,参数的类型和返回函数类似。

    +void SetAttribute( const std::string& name, const std::string& _value );

    +void SetAttribute( const std::string& name, int _value );

    +void SetDoubleAttribute( const char * name, double value );

    FirstAttributeLastAttribute可以让你返回第一个和最后一个属性,它们的函数声明如下:

    +TiXmlAttribute* FirstAttribute()

    +TiXmlAttribute* LastAttribute()  

    RemoveAttribute函数可以让你删除指定名称的属性,它的函数声明如下:

    +void RemoveAttribute( const std::string& name )

    元素函数总结

    ValueStr                //返回元素名称

    SetValue                //设置元素名称

    Parent              //返回父节点对象

     

    FirstChild          //返回第一个子节点

    LastChild               //返回最后一个子节点

    IterateChildren     //返回下一个子节点

     

    InsertEndChild      //在最后一个子节点后插入子节点

    InsertBeforeChild       //在指定的子节点前插入子节点

    InsertAfterChild        //在指定的子节点后插入子节点

    ReplaceChild            //替换指定的子节点

    RemoveChild         //删除指定的子节点

    Clear               //删除所有的子节点

     

    PreviousSibling     //返回同级中前一个节点

    NextSibling         //返回同级中后一个节点

     

    NextSiblingElement      //返回同级中后一个元素

    FirstChildElement       //返回第一个子元素节点

    Attribute               //返回元素中的属性值

    QueryValueAttribute //返回元素中的属性值

    SetAttribute            //设置元素中的属性值

    FirstAttribute      //返回元素中第一个属性对象

    LastAttribute           //返回元素中最后一个属性对象

    RemoveAttribute     //删除元素中指定的属性对象

    属性类

    属性为名称="值"对,元素可以具有属性值,但名称必须唯一。

    你可以通过

    +const std::string& NameTStr() const

    返回属性名称

    也可以通过下面三个函数返回属性值:

    +const std::string& ValueStr() const

    +int               IntValue() const;

    +double            DoubleValue() const;

    当然你也可以设置属性值,它们的函数声明如下:

    +void SetName( const std::string& _name )

    +void SetIntValue( int _value );  

    +void SetDoubleValue( double _value );

    +void SetValue( const std::string& _value )

    以上函数与元素类中的相关函数类似,这里不重复介绍了。

    在元素属性中,通常具有许多属性,你可以通过Next函数返回下一个属性对象的指针,也可以通过Previous函数获得上一个属性对象的指针。它们的函数声明如下:

    +TiXmlAttribute* Next()

    +TiXmlAttribute* Previous()

  • 相关阅读:
    Nginx作为缓存服务
    Nginx作为代理服务
    ZipUtils zip压缩实现
    getman九桃小说解析油猴脚本
    maven添加代理加速jar包下载
    ffmpeg MP3 flv 视频转mp3
    ActiveMQ配置用户认证信息
    JS实现HTML标签转义及反转义
    删除registry镜像数据,以centos为例
    启动一个带登录账号密码的registry容器
  • 原文地址:https://www.cnblogs.com/dps001/p/4386325.html
Copyright © 2011-2022 走看看