c++环境下XML文本读写

一、TinyXML

tinyXml是一个免费开源的C++库,可以到官网上下载:TinyXML官网

tinyXML官方文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html

(1)注意事项

解压之后

  • 把tinystr.cpp, tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.h, tinyxml.h拷贝到工程目录下;
  • 然后加入头文件引用:#include "tinystr.h"   #include "tinyxml.h"

为了方便从XML中读取数据,可以自己写个相应的类或者结构体来存储。

vector<Customer *> customerSet(0);  //每个元素是Customer对象的指针
    int i,j,k,count;
    int temp1;    // 存放整型数据
    float temp2;  // 存放浮点型数据
    Customer* customer;   // 临时顾客节点指针
    for (i=0; i<NUM_OF_CUSTOMER; i++) {  // 先初始化顾客集
        customer = new Customer();
        customerSet.push_back(customer);
    }
    TiXmlDocument doc(FILENAME);    // 读入XML文件
    if(!doc.LoadFile()) return -1;  // 如果无法读取文件,则返回
    TiXmlHandle hDoc(&doc);         // hDoc是&doc指向的对象
    TiXmlElement* pElem;            // 指向元素的指针
    pElem = hDoc.FirstChildElement().Element(); //指向根节点
    TiXmlHandle hRoot(pElem);       // hRoot是根节点
 
    //读取x,y,它们放在network->nodes->node节点中
    TiXmlElement* nodeElem = hRoot.FirstChild("network").FirstChild("nodes").FirstChild("node").Element(); //当前指向了node节点
    count = 0;  //记录移动到了哪个node节点,并且把该node节点的信息录入到顺序对应的customer中
    for(nodeElem; nodeElem; nodeElem = nodeElem->NextSiblingElement()) { // 挨个读取node节点的信息
        customer = customerSet[count];  // 当前节点,注意不能赋值给一个新的对象,否则会调用复制构造函数
        TiXmlHandle node(nodeElem);  // nodeElem所指向的节点
        TiXmlElement* xElem = node.FirstChild("cx").Element();  // cx节点
        TiXmlElement* yElem = node.FirstChild("cy").Element();  // cy节点
        nodeElem->QueryIntAttribute("id", &temp1);  //把id放到temp1中,属性值读法
        customer->setId(temp1);          
        temp2 = atof(xElem->GetText());    // char转float
        customer->setX(temp2);
        temp2 = atof(yElem->GetText());
        customer->setY(temp2);
        count++;
    }

(2)TinyXML的类组织形式

  • TiXmlDocument : XML文档类,它一般用于指示一个文档对象;
  • TiXmlDeclaration:  XML标识类,也就是XML文件第一行中标注的相关信息;
  •  TiXmlElement:    XML节点类,这个类用来表示一个节点;
  • TiXmlText:      XML节点类的文本信息类,标注了XML节点类的文本信息;
  • TiXmlComment: XML的注释信息类,用来标识XML文档类的注释信息;

(3)XML使用方法

  • TiXmlDocument:文件节点,把Xml文件的内容读入到该类型变量中
  • TiXmlElement*:指向节点的指针
  • TiXmlHandle:节点的实例,也就是TiXmlElement所指向的对象
  • FirstChild("nodeName"):第一个名字为“nodeName”的子节点
  • NextSiblingElement():下一个兄弟节点元素,它们有相同的父节点
  • QueryIntAttribute("attributeName", &var):把节点属性名为attributeName的属性值以int类型赋值给var变量
  • GetText():获取当前节点元素的内容,即包含在<node>text</node>中的text
string fileName = "test.xml";  
    TiXmlDocument *doc = new TiXmlDocument();               //创建xml文档对象  
      
    TiXmlDeclaration *pDeclaration = new TiXmlDeclaration("1.0","UTF-8","");  
    doc->LinkEndChild(pDeclaration);  
      
    TiXmlElement *RootLv1 = new TiXmlElement("Numbers");    //创建一个根结点  
    doc->LinkEndChild(RootLv1);                              //链接到文档对象下  
      
    TiXmlElement *RootLv2 = new TiXmlElement("number");     //创建一个节点  
    RootLv1->LinkEndChild(RootLv2);                          //链接到节点RootLv1下  
    RootLv2->SetAttribute("Number", "1");                    //设置节点RootLv2属性  
      
    TiXmlElement *Name = new TiXmlElement("name");          //创建节点  
    RootLv2->LinkEndChild(Name);                         //链接节点到RootLv2下  
      
    TiXmlElement *Price = new TiXmlElement("price");        //创建节点  
    RootLv2->LinkEndChild(Price);                            //链接节点到RootLv2下  
      
    TiXmlText *NameText = new TiXmlText("Robin");           //创建XmlText文本  
    Name->LinkEndChild(NameText);                            //链接到Name下  
  
    TiXmlText *PriceText = new TiXmlText("22.5");           //创建XmlText  
    Price->LinkEndChild(PriceText);                          //链接到Price下  
       
    doc->SaveFile("c:\\test.xml");                           //保存到文件  
    return 0;  

函数atof在库<stdlib>中,Unicode字符环境下用以将char数组转化为浮点数。

二、CMarkup

1.参考:https://blog.csdn.net/github_36679988/article/details/53173791

2.c++中map的使用参考:

1)C++中map容器的说明和使用技巧

2)c++使用map

 

参考博客

【1】TinyXML:c++中读取TinyXML到类对象中

【2】使用TinyXML读写xml文件

【3】XTP库读写XML文件

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XML即可扩展标记语言(Extensible Markup Language)是一种用于存储和传输数据的通用标记语言。在使用XML进行读写操作时,可以通过封装和解析XML来实现。 首先,我们可以使用编程语言中的XML库来读取XML文件。这些库通常提供了一组函数或方法,用于加载XML文件并将其解析为可供我们使用的数据结构。这样,我们就可以通过访问和操作数据结构来获取XML文件中的信息。例如,我们可以使用库提供的函数来获取指定标签的值,或者遍历整个XML文档以获取所需的数据。 另外,我们也可以使用XML库来创建XML文件。通过使用库提供的函数或方法,我们可以定义XML文档的结构和内容,并将其保存为一个新的XML文件。我们可以按照XML的语法规则创建标签、属性和文本,并根据需要进行嵌套。这样,我们就可以按照自己的需求创建一个具有特定结构和内容的XML文件。 在封装XML的过程中,我们可以根据实际需求将读写操作封装为函数或方法。这样,我们可以将读取XML文件的过程封装为一个函数,以便在需要时调用,并返回所需的数据。同样地,我们也可以将创建XML文件的过程封装为一个函数,以便在需要时调用并生成所需的XML文件。 通过封装XML读写操作,我们可以提高代码的可重用性和可维护性。我们可以在多个项目中使用相同的封装函数,而不必重复编写相同的代码。同时,如果需要对读写操作进行优化或修改,也可以集中在封装函数中进行,而不必修改所有使用XML读写的代码。 总而言之,通过封装XML读写操作,我们可以方便地读取和创建XML文件,并能够更加高效地处理和管理XML数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值