如下是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);
}
}
uj5u.com熱心網友回復:
xml 加上 <?xml version="1.0" encoding="gbk"?>uj5u.com熱心網友回復:
這個是我忘記發出來了,原xml檔案中有這行。
uj5u.com熱心網友回復:
"EditXML.rar"http://download.csdn.net/detail/schlafenhamster/8685007
本程式 決議XML 檔案, 并可以 修改 屬性值. 使用 MSXML2
uj5u.com熱心網友回復:
感覺像是編碼問題,xml檔案如果是ansi編碼而程式用的unicode環境,代碼里的字串匹配就會出問題轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/116827.html
標籤:HTML/XML
上一篇:有人玩soui界面庫嗎?
下一篇:對話框繪圖的重繪
