markup库除了能以Load的方式解析XML文件外,还提供了setdoc的方法,通过加载XML字符串来解析XML,不过前提是都得是完整的XML文件。所以当手头有XML字符串时不必要写入文件来解析,或者当拆分了很大的XML后,没必要保存成一个一个文件送给markup解析。
具体用法如下:(给出了查找方法,具体查找什么信息要根据你的XML来具体写代码)
#include "Markup.h"
#include <iostream>
char strxml[] = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
"<Response>"
"<CmdType>Catalog</CmdType>"
"<SN>12 </SN >"
"<DeviceID>34020000002000000001 </DeviceID >"
"<SumNum>19046 < / SumNum >"
"<DeviceList Num = \"1\">"
"<Item>"
"<DeviceID>34020000002000000001 </DeviceID >"
"<Name>*******</Name>"
"<Manufacturer>******</Manufacturer>"
"</Item>"
"</DeviceList>"
"</Response>";
CMarkup xml;
xml.SetDoc(xml);
xml.ResetPos();
//定位根节点
if (!xml.FindElem(XML_DATA_INFO_ROOT))
{
//cout << "not find root" << endl;
return 0;
}
xml.IntoElem();//进入根节点
while (xml.FindElem(XML_DATA_INFO_DEVICELIST))
{
xml.IntoElem();
while (xml.FindElem(XML_DATA_INFO_ITEM))
{
if (xml.FindChildElem(XML_DATA_INFO_DEVICEID))
{
cout << "pdata.dwDeviceID " << xml.GetChildData() << endl;
}
xml.ResetChildPos();
if (xml.FindChildElem(XML_DATA_INFO_NAME))
{
cout << "pdata.dwDeviceID " << xml.GetChildData() << endl;
}
xml.ResetChildPos();
if (xml.FindChildElem(XML_DATA_INFO_CIVILCODE))
{
cout << "pdata.dwDeviceID " << xml.GetChildData() << endl;
}
xml.ResetChildPos();
if (xml.FindChildElem(XML_DATA_INFO_LONGITUDE))
{
pdata.Longitude = xml.GetChildData();
//cout << "pdata.dwDeviceID " << xml.GetChildData() << endl;
}
xml.ResetChildPos();
if (xml.FindChildElem(XML_DATA_INFO_LATITUDE))
{
pdata.Latitude = xml.GetChildData();
//cout << "pdata.dwDeviceID " << xml.GetChildData() << endl;
}
m_arrXmlDataInfo.Add(pdata);
}
xml.OutOfElem();
}
xml.OutOfElem();
return 0;
}