前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

xmlTest

作者头像
用户3519280
发布2023-07-07 20:41:52
1850
发布2023-07-07 20:41:52
举报
文章被收录于专栏:c++ 学习分享
代码语言:javascript
复制
// xmlTest.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>
#include <string>
#include <windows.h>
#include <atlstr.h>
#include <vector>

#define TIXML_USE_STL
#include "tinyxml.h"
#include "tinystr.h"

#pragma comment(lib,"tinyxmlSTL.lib")

using namespace std;

struct ST_DEVICE_INFO
{
	string m_strID;                 //设备ID
	string m_strParentID;           //父ID
	string m_strName;               //设备名

	int m_nType;                    //类型
	int m_nStatus;                  //状态

	float m_fLongitude;             //经度
	float m_fLatitude;              //纬度

	ST_DEVICE_INFO()
	{
		m_strID.clear();
		m_strParentID.clear();
		m_strName.clear();

		m_nType = 0;
		m_nStatus = 0;

		m_fLongitude = 0;
		m_fLatitude = 0;
	}
};
typedef vector<ST_DEVICE_INFO> VEC_DEVICE;

std::string UtfToGbk(const char* utf8)
{
	int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len + 1];
	memset(wstr, 0, len + 1);
	MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
	len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
	char* str = new char[len + 1];
	memset(str, 0, len + 1);
	WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);
	if (wstr) delete[] wstr;
	return str;
}

bool CreateXmlFile(string& szFileName)
{//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
    try
    {
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument();

        TiXmlElement *RootElement = new TiXmlElement("Response");
        myDocument->LinkEndChild(RootElement);

        TiXmlElement *DeviceListElement = new TiXmlElement("DeviceList");
        RootElement->LinkEndChild(DeviceListElement);

        DeviceListElement->SetAttribute("Num", "3");

		TiXmlElement *ItemElement = new TiXmlElement("Item");
        DeviceListElement->LinkEndChild(ItemElement);


        TiXmlElement *DeviceIDElement = new TiXmlElement("DeviceID");
        TiXmlElement *NameElement = new TiXmlElement("Name");
        ItemElement->LinkEndChild(DeviceIDElement);
        ItemElement->LinkEndChild(NameElement);

        TiXmlText *DeviceIDContent = new TiXmlText("44130000002000000002");
        TiXmlText *NameContent = new TiXmlText("测试平台");
        DeviceIDElement->LinkEndChild(DeviceIDContent);
        NameElement->LinkEndChild(NameContent);

		myDocument->SaveFile(szFileName.c_str());//保存到文件
    }
    catch (string& e)
    {
        return false;
    }
    return true;
}

bool ReadXmlFile(string& szFileName)
{//读取Xml文件,并遍历
    try
    {
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument(szFileName.c_str());
        myDocument->LoadFile();
        //获得根元素,即Response。
        TiXmlElement *RootElement = myDocument->RootElement();
        //输出根元素名称,即输出Response。
        cout << RootElement->Value() << endl;
        //获得第一个DeviceList节点。
        TiXmlElement *DeviceListElement = RootElement->FirstChildElement();
		TiXmlAttribute *NumAttribute = DeviceListElement->FirstAttribute();
		cout << NumAttribute->Value()<< endl;

        //获得第一个Person的name节点和age节点和ID属性。
        TiXmlElement *ItemElement = DeviceListElement->FirstChildElement();
		for (int i = 0; i < 3; i++)
		{
			if (ItemElement)
			{
				TiXmlElement *DeviceIDElement = ItemElement->FirstChildElement();
				//这里注意判断是否存在,否则容易崩溃
				if (DeviceIDElement && DeviceIDElement->FirstChild())
				{
					cout << DeviceIDElement->FirstChild()->Value() << endl;

					TiXmlElement *NameElement = DeviceIDElement->NextSiblingElement();
					if (NameElement && NameElement->FirstChild())
					{
						cout << NameElement->FirstChild()->Value() << endl;

						TiXmlElement *ParentIDElement = NameElement->NextSiblingElement();
						if (ParentIDElement && ParentIDElement->FirstChild())
						{
							cout << ParentIDElement->FirstChild()->Value() << endl;
						}
					}
				}

				ItemElement = ItemElement->NextSiblingElement();
			}
		}
    }
    catch (string& e)
    {
        return false;
    }
    return true;
}

bool ReadXmlString(string& xmlString, VEC_DEVICE& device_list)
{//读取Xml文件,并遍历
    try
    {
        //创建一个XML的文档对象。
        TiXmlDocument *myDocument = new TiXmlDocument();
		myDocument->Parse(xmlString.c_str());
        //获得根元素,即Response。
        TiXmlElement *RootElement = myDocument->RootElement();
        //输出根元素名称,即输出Response。
        cout << RootElement->Value() << endl;
        //获得第一个DeviceList节点。
        TiXmlElement *DeviceListElement = RootElement->FirstChildElement();
		TiXmlAttribute *NumAttribute = DeviceListElement->FirstAttribute();
		cout << NumAttribute->Value()<< endl;

        //获得第一个Person的name节点和age节点和ID属性。
        TiXmlElement *ItemElement = DeviceListElement->FirstChildElement();
		ST_DEVICE_INFO device_info ;
		for (; ItemElement != NULL; ItemElement = ItemElement->NextSiblingElement())
		{
			if (ItemElement)
			{
				ST_DEVICE_INFO device_info;
				TiXmlElement *DeviceIDElement = ItemElement->FirstChildElement();
				if (DeviceIDElement && DeviceIDElement->FirstChild())
				{
					string str = "";
					str = DeviceIDElement->FirstChild()->Value();
					//注意是否需要从utf-8转为GBK
					device_info.m_strID = str.c_str();// UtfToGbk(str.c_str());
					cout << "ID   "<<device_info.m_strID.c_str()<< endl;

					TiXmlElement *NameElement = DeviceIDElement->NextSiblingElement();
					if (NameElement && NameElement->FirstChild())
					{
						str = "";
						str = NameElement->FirstChild()->Value();
						device_info.m_strName = str.c_str();// UtfToGbk(str.c_str());
						cout << "name  "<< device_info.m_strName << endl;

						TiXmlElement *ParentIDElement = NameElement->NextSiblingElement();
						if (ParentIDElement && ParentIDElement->FirstChild())
						{
							str = "";
							str = ParentIDElement->FirstChild()->Value();
							device_info.m_strParentID = str.c_str();// UtfToGbk(str.c_str());
							cout << "m_strParentID  "<<device_info.m_strParentID.c_str()<< endl;
						}

						device_info.m_nStatus = 1;

						device_list.push_back(device_info);
					}
				}
				else
				{
					continue;
				}
			}
		}
    }
    catch (string& e)
    {
        return false;
    }
    return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
	string fileName = "test.xml";
    CreateXmlFile(fileName);

	cout << "xml文件解析:" << endl;
    ReadXmlFile(fileName);

	cout << endl;
	cout << "字符串解析:" << endl;

	string xmlStr = "\
				<?xml version=\"1.0\" encoding=\"utf - 8\" standalone=\"no\" ?> \
				<Response>\
					<DeviceList Num=\"3\">\
						<Item>\
							<DeviceID>44130000002000000002</DeviceID>\
							<Name>测试平台</Name>\
						</Item>\
						<Item>\
							<DeviceID>441301</DeviceID>\
							<Name>惠州市</Name>\
							<ParentID>44130000002000000002</ParentID>\
						</Item>\
						<Item>\
							<DeviceID>44130000002000000068</DeviceID>\
							<Name>邮政储蓄门口</Name>\
							<ParentID>441301</ParentID>\
						</Item>\
						<Item>\
							<DeviceID>44130000002000000068</DeviceID>\
							<Name>邮政储蓄门口</Name>\
							<ParentID>441301</ParentID>\
						</Item>\
						<Item>\
							<DeviceID>44130000002000000068</DeviceID>\
							<Name>邮政储蓄门口</Name>\
							<ParentID>441301</ParentID>\
						</Item>\
						<Item>\
							<DeviceID>44130000002000000068</DeviceID>\
							<Name>邮政储蓄门口</Name>\
							<ParentID>441301</ParentID>\
						</Item>\
						<Item>\
							<DeviceID>44130000002000000068</DeviceID>\
							<Name>邮政储蓄门口</Name>\
							<ParentID>441301</ParentID>\
						</Item>\
						<Item>\
							<DeviceID>44130000002000000068</DeviceID>\
							<Name>邮政储蓄门口</Name>\
							<ParentID>441301</ParentID>\
						</Item>\
					</DeviceList>\
				</Response>" ;

	VEC_DEVICE device_list ;
	device_list.clear() ;
	ReadXmlString(xmlStr, device_list) ;
	cout << endl;

	for (int i = 0; i < device_list.size(); i++)
	{
		cout<< "设备ID:" <<device_list[i].m_strID<<"  设备名称:"<<device_list[i].m_strName<<"   父ID: "<<device_list[i].m_strParentID<<endl ;
	}

	system("pause");

	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档