关于在mfc中使用msxml读取xml文件的疑问。xml文件的格式和源码如下。没有报错,但无法将xml数据读入。

zhangjh34 2016-12-04 07:18:00
如下是xml文件的格式
<简化城市信息>
<城市>
北京
<经度> 116 </经度>
<纬度> 40 </纬度>
<城市名称>
沈阳 <编号> G1 </编号> <里程> 661 </里程>
</城市名称>
<城市名称>
天津 <编号> G2 </编号> <里程> 92 </里程>
</城市名称>
<城市名称>
石家庄 <编号> G4 </编号> <里程> 268 </里程>
</城市名称>
<城市名称>
呼和浩特 <编号> G6 </编号> <里程> 478 </里程>
</城市名称>
</城市>
<城市>
上海
<经度> 121 </经度>
<纬度> 31 </纬度>
<城市名称>
济南 <编号> G2 </编号> <里程> 806 </里程>
</城市名称>
<城市名称>
南京 <编号> G42 </编号> <里程> 337 </里程>
</城市名称>
<城市名称>
武汉 <编号> G50 </编号> <里程> 908 </里程>
</城市名称>
<城市名称>
杭州 <编号> G60 </编号> <里程> 165</里程>
</城市名称>
</城市>
<城市>
<简化城市信息>

如下是我的源码(这是在C**VIEW.h的public中定义的结构体和函数)

struct citymessage
{
string name;
int x;
int y;
CString direct[10];
CString directnum[10];
int distance[10];
}city[33];

void ReadXml()
{
MSXML2::IXMLDOMDocumentPtr pDoc;
::CoInitialize(NULL);
HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40));
if (!SUCCEEDED(hr))
{
MessageBox(_T("创建DOMDocument对象失败。\n请检查运行环境"), _T("错误"), MB_ICONERROR);
return;
}

pDoc->load("城市信息(简).xml");

/*
pDoc->put_async(VARIANT_FALSE);
VARIANT_BOOL bhr = pDoc->load((_variant_t)strXmlPath);
if (bhr != VARIANT_TRUE) {
MessageBox(_T("无法正确读取xml文件"), _T("错误"), MB_ICONERROR);
return;
}
*/

MSXML2::IXMLDOMElementPtr root = pDoc->documentElement;
// 取得根节点的名字
_variant_t strRootName = root->nodeName;
_bstr_t wstrRootName(strRootName.bstrVal);
MSXML2::IXMLDOMNodeListPtr cityList = root->GetchildNodes(); //cases,即为每个子节点也就是32个省会城市

// 解析cases的子节点,读取32个城市的信息
int ilength = cityList->Getlength(); //ilength子节点个数,本程序中也可以设定为32
for (nodeCount = 0; nodeCount < ilength; nodeCount++)
{

MSXML2::IXMLDOMNodePtr citymessage = cityList->nextNode();
_variant_t CityName = citymessage->GetnodeName();
_variant_t CityValue = citymessage->GetnodeValue();
city[nodeCount].name = (char*)(_bstr_t)citymessage->text; //读取第nodeCount个城市的名称
//开始读取其经纬度和高速连通信息
ReadCity(citymessage->GetchildNodes());
}
}

void ReadCity(MSXML2::IXMLDOMNodeListPtr nodeList)
{
CString messagex, messagey,messagename;
int messagelength = nodeList->Getlength();
for (messageCount = 0; messageCount < messagelength; messageCount++)
{
MSXML2::IXMLDOMNodePtr messagenode = nodeList->nextNode();
_variant_t messagenodeName = messagenode->GetnodeName();
_variant_t messagenodeeValue = messagenode->Gettext();
BSTR bStrTemp = messagenodeName.bstrVal;
CString strTemp = CString(bStrTemp);
SysFreeString(bStrTemp);
CString strNodeName = strTemp;
if (0 == strNodeName.CompareNoCase(_T("经度")))
{
messagex = (BSTR)messagenodeName.pbstrVal;
}
if (0 == strNodeName.CompareNoCase(_T("纬度")))
{
messagey = (BSTR)messagenodeName.pbstrVal;
}
if (0 == strNodeName.CompareNoCase(_T("城市名称")))
{
messagename = (BSTR)messagenodeName.pbstrVal;
ReadLoad(messagenode->GetchildNodes());
}
city[nodeCount].x = _ttoi(messagex);
city[nodeCount].y = _ttoi(messagey);
city[nodeCount].direct[messageCount - 2] = messagename;
}
}

void ReadLoad(MSXML2::IXMLDOMNodeListPtr nodeList)
{
CString loadistance;
int loadlength = nodeList->Getlength();
for (int loadnum = 0; loadnum < loadlength; loadnum++)
{
MSXML2::IXMLDOMNodePtr loadnode = nodeList->nextNode();
_variant_t loadnodeName = loadnode->GetnodeName();
_variant_t loadnodeValue = loadnode->Gettext();
BSTR bStrTemp = loadnodeName.bstrVal;
CString strTemp = CString(bStrTemp);
SysFreeString(bStrTemp);
CString strNodeName = strTemp;
if (0 == strNodeName.CompareNoCase(_T("编号")))
{
city[nodeCount].directnum[messageCount - 2] = (BSTR)loadnodeName.pbstrVal;
}
if (0 == strNodeName.CompareNoCase(_T("里程")))
{
loadistance = (BSTR)loadnodeName.pbstrVal;
}
city[nodeCount].distance[messageCount - 2] = _ttoi(loadistance);
}
}
...全文
1284 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cutmelon 2016-12-06
  • 打赏
  • 举报
回复
感觉像是编码问题,xml文件如果是ansi编码而程序用的unicode环境,代码里的字符串匹配就会出问题
schlafenhamster 2016-12-06
  • 打赏
  • 举报
回复
"EditXML.rar"
http://download.csdn.net/detail/schlafenhamster/8685007
本程序 解析XML 文件, 并可以 修改 属性值. 使用 MSXML2
zhangjh34 2016-12-06
  • 打赏
  • 举报
回复
引用 1 楼 chengbar 的回复:
xml 加上 <?xml version="1.0" encoding="gbk"?>
这个是我忘记发出来了,原xml文件中有这行。
sevancheng 2016-12-05
  • 打赏
  • 举报
回复
xml 加上 <?xml version="1.0" encoding="gbk"?>

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧