C++读入XML文件示例

2020-01-06 16:03:44王振洲

最近要做一个VRP的算法,测试集都是放在Xml文件中,而我的算法使用C++来写,所以需要用C++来读取Xml文件。

在百度上搜“C++读取Xml文件”,可以出来很多博客,大多数是关于tinyXml的,所以这篇博文也是讲述如何用tinyXML来读取XML文件。

tinyXml是一个免费开源的C++库,可以到官网上下载:https://www.easck.com/>

我是在windows下用VS来写C++的,按照@marchtea的说法,只需要直接打开tinyxml.sln就可以,不过我还是用了笨办法:

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

接下来就来分享一下我读取VRP问题中的solomon benchmark的方法,这些方法都是参考自tinyXml的官方教程,在下载的文件夹中有"doc"子文件夹,打开它,有一个叫做"tutorial0"的html文件,打开它可以看到详细的教程。

OK,now begins!

我要读取的Xml文件有如下的格式(只列举部分):


<!-- 要读取的Xml文件 -->

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<instance>

  <network>

    <nodes>

      <node id="0" type="0">

        <cx>40.0</cx>

        <cy>50.0</cy>

      </node>

    <!-- 有N+1个这样的node节点 -->

    </nodes>  

  </network>

  <requests>

    <request id="1" node="1">

      <tw>

        <start>145</start>

        <end>175</end>

      </tw>

      <quantity>20.0</quantity>

      <service_time>10.0</service_time>

    </request>

    <!-- 有N个这样的request节点 -->

  </requests>

</instance>

这里稍微解释一下为什么nodes节点的数目会比requests节点多1个。这是因为nodes节点包括了顾客节点(N个)和仓库节点(1个),而requests属性只属于顾客节点。

我是把xml文件中的这些数据读入到类对象数组中,每个类对象代表一个节点,类的定义如下:


// Customer.h

#ifndef _Customer_H

#define _Customer_H

 

class Customer{

public:

  Customer(int id=0, float x=0, float y=0, float startTime=0, float endTime=0, float quantity=0, float serviceTime=0);

  void setId(int id);  // 设置成员id的值

  void setX(float x);  // 设置成员x的值

  void setY(float y);  // 设置成员y的值

  void setStartTime(float startTime); // 设置成员startTime的值

  void setEndTime(float endTime);   // 设置成员endTime的值

  void setQuantity(float quantity);  // 设置成员quantity的值

  void setServiceTime(float serviceTime); // 设置成员serviceTime的值

  void show(); // 显示顾客节点信息

private:

  int id;

  float x;

  float y;

  float startTime;

  float endTime;

  float quantity;

  float serviceTime;

};

#endif