• C++解析XML文件(TinyXML)


    简介

            TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。


    TinyXML库下载

    本文所用库文件来自 

    TinyXML 下载 |SourceForge.neticon-default.png?t=N7T8https://sourceforge.net/projects/tinyxml/*请注意*TinyXML开发已经停止,所有开发都已转移到TinyXML-2。TinyXML-2 可在https://github.com/leethomason/tinyxml2


    库目录简介

    将库文件压缩包解压后,即可看到以下文件内容:

    其中,核心库文件即为

    tinystr.cpp

    tinystr.h

    tinyxml.cpp

    tinyxml.h

    tinyxmlerror.cpp

    tinyxmlparser.cpp

    其他文件是官方给的示例工程文件,如果电脑安装了VS,可以打开tinyxml.sln工程文件,查看官方示例程序。


    库使用讲解

            官方给的示例程序有点复杂。因此,笔者参考了一下各种资料,简单做了些小例子,方便刚使用这个库的同学上手。

            首先我们需要了解库中几个重要的对象:

    TiXmlDocument:一个XML的文档对象

    TiXmlElement:一个元素对象

    顾名思义,一个XML文件对应着一个TiXmlDocument;XML文件中每个树节点,对应一个TiXmlElement。一个节点与子节点的连接关系,即一个元素对象和子元素对象的连接关系。

    TiXmlElement下有一些方法,能够实现数据的载入和元素之间的连接:

    TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ):元素连接

    void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ):设置节点的属性和值


    库使用示例

            直接上代码

    1. // tinyxml-test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    2. //
    3. #include <iostream>
    4. #include <stdio.h>
    5. #include "tinystr.h"
    6. #include "tinyxml.h"
    7. using namespace std;
    8. void creatXmlFile();
    9. void ReadXmlFile();
    10. int main()
    11. {
    12. creatXmlFile();
    13. ReadXmlFile();
    14. }
    15. void creatXmlFile()
    16. {
    17. TiXmlDocument* myDocument = new TiXmlDocument();
    18. TiXmlElement* RootElement = new TiXmlElement("Persons");
    19. myDocument->LinkEndChild(RootElement);
    20. TiXmlElement* PersonElement = new TiXmlElement("Person");
    21. RootElement->LinkEndChild(PersonElement);
    22. PersonElement->SetAttribute("ID", "1");
    23. TiXmlElement* NameElement = new TiXmlElement("name");
    24. TiXmlElement* AgeElement = new TiXmlElement("age");
    25. PersonElement->LinkEndChild(NameElement);
    26. PersonElement->LinkEndChild(AgeElement);
    27. TiXmlText* NameContent = new TiXmlText("周星星");
    28. TiXmlText* AgeContent = new TiXmlText("22");
    29. NameElement->LinkEndChild(NameContent);
    30. AgeElement->LinkEndChild(AgeContent);
    31. PersonElement = new TiXmlElement("Person");
    32. RootElement->LinkEndChild(PersonElement);
    33. PersonElement->SetAttribute("ID", "2");
    34. NameElement = new TiXmlElement("name");
    35. AgeElement = new TiXmlElement("age");
    36. PersonElement->LinkEndChild(NameElement);
    37. PersonElement->LinkEndChild(AgeElement);
    38. NameContent = new TiXmlText("周大福");
    39. AgeContent = new TiXmlText("23");
    40. NameElement->LinkEndChild(NameContent);
    41. AgeElement->LinkEndChild(AgeContent);
    42. myDocument->SaveFile("info.xml");
    43. cout << "写入完成 " << endl << endl;
    44. }
    45. void ReadXmlFile()
    46. {
    47. //创建一个XML的文档对象。
    48. TiXmlDocument* myDocument = new TiXmlDocument("info.xml");
    49. myDocument->LoadFile();
    50. //获得根元素,即Persons。
    51. TiXmlElement* RootElement = myDocument->RootElement();
    52. //输出根元素名称,即输出Persons。
    53. cout << "根元素标签名:: " << RootElement->Value() << endl;
    54. //获得第一个Person节点。
    55. TiXmlElement* FirstPerson = RootElement->FirstChildElement();
    56. //获得第一个Person的name节点和age节点和ID属性。
    57. TiXmlElement* NameElement = FirstPerson->FirstChildElement();
    58. TiXmlElement* AgeElement = NameElement->NextSiblingElement();
    59. TiXmlAttribute* IDAttribute = FirstPerson->FirstAttribute();
    60. //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
    61. cout << "子节点标签名:: " << NameElement->Value() << endl;
    62. cout << "子节点name:: " << NameElement->FirstChild()->Value() << endl;
    63. cout << "子节点age:: " << AgeElement->FirstChild()->Value() << endl;
    64. cout << "子节点ID:: " << IDAttribute->Value() << endl;
    65. }

    注意工程中要引入库文件:

    运行结果:


    总结

            其实也就是一层一层节点直接的创建,设置,链接。是个非常简单的结构。

  • 相关阅读:
    vi配置文件.vimrc内容示例
    特殊电脑数据恢复软件EasyRecovery2024
    Kubernetes集群环境搭建
    昨天阅读量800多
    【k8s】Kubernetes版本v1.17.3 kubesphere 3.1.1 默认用户登录失败
    庖丁解牛:NIO核心概念与机制详解 01 _ 入门篇
    JDK8中HashMap底层源码解析-resize方法
    <dependencyManagement>的作用
    若依vue-初步下载使用
    springboot读取resources目录下文件那点事
  • 原文地址:https://blog.csdn.net/qq_25662827/article/details/132803557