有个xml文件,我想把它解析到一个列表m_softListMsg中
-<NewDataSet>
- <ForumPosts>
<PKID>6</PKID>
<Title>如何让win2000服务器每天定时自动重启?</Title>
<UserName>zjroland</UserName>
<Point>50</Point>
<ReplyNum>0</ReplyNum>
<PostTime>2005-12-02T10:22:00.0000000+08:00</PostTime>
</ForumPosts>
- <ForumPosts>
<PKID>4</PKID>
<Title>xp启动到桌面就不动了,请各位大侠帮忙!</Title>
<UserName>zjroland</UserName>
<Point>40</Point>
<ReplyNum>0</ReplyNum>
<PostTime>2005-12-02T09:58:00.0000000+08:00</PostTime>
</ForumPosts>
- <ForumPosts>
<PKID>1</PKID>
<Title>一次测试而已</Title>
<UserName>webteach</UserName>
<Point>50</Point>
<ReplyNum>2</ReplyNum>
<PostTime>2002-07-12T17:12:00.0000000+08:00</PostTime>
</ForumPosts>
</NewDataSet>代码如下:CComPtr<IXMLDOMDocument> spDoc;
hr = spDoc.CoCreateInstance(__uuidof(DOMDocument));
if (FAILED(hr))
{
MessageBox("CoCreateInstance failed.");
return;
}
// 装载XML文档。
VARIANT_BOOL varLoadSuccessful;
hr = spDoc->loadXML(bstrForumListXML, &varLoadSuccessful);
if (FAILED(hr) || varLoadSuccessful != VARIANT_TRUE)
{
MessageBox("Failed loading the XML stream into the DOM.");
return;
}
//spDoc->save(CComVariant("d:\\ForumListXml.xml"));
IXMLDOMNodeList *pIDOMNodeList = NULL;
IXMLDOMNode *pPostsNode = NULL;
IXMLDOMNodeList *pChildNodeList;
IXMLDOMNode *pIDOMNode = NULL;
long value;
BSTR bstrItemText;
BSTR tag = SysAllocString(L"ForumPosts"); hr = spDoc->getElementsByTagName(tag , &pIDOMNodeList);
hr = pIDOMNodeList->get_length(&value);
if(SUCCEEDED(hr))
{
long TotalItems;
pIDOMNodeList->reset();
for(int i = 0; i < value; i++)
{
m_softListMsg.InsertItem(i,"");
pIDOMNodeList->get_item(i,&pPostsNode);
pPostsNode->get_childNodes(&pChildNodeList);
hr=pChildNodeList->get_length(&TotalItems);
for(int j = 0; j < TotalItems; j++)
{
pChildNodeList->get_item(j, &pIDOMNode); //出现错误:读取时发生访问冲突。
if(pIDOMNode )
{
pIDOMNode->get_text(&bstrItemText);
CString strText = (CString)bstrItemText;
m_softListMsg.SetItemText(i, j, strText);
pIDOMNode->Release();
pIDOMNode = NULL;
}
pChildNodeList->Release();
pChildNodeList = NULL;
}
pPostsNode->Release();
pPostsNode = NULL;
}
}
pIDOMNodeList->Release();
pIDOMNodeList = NULL;
SysFreeString(tag);出现错误:读取位置 0x00000000000时发生访问冲突。出错位置上面已经标明,请大家看看错在哪里?
-<NewDataSet>
- <ForumPosts>
<PKID>6</PKID>
<Title>如何让win2000服务器每天定时自动重启?</Title>
<UserName>zjroland</UserName>
<Point>50</Point>
<ReplyNum>0</ReplyNum>
<PostTime>2005-12-02T10:22:00.0000000+08:00</PostTime>
</ForumPosts>
- <ForumPosts>
<PKID>4</PKID>
<Title>xp启动到桌面就不动了,请各位大侠帮忙!</Title>
<UserName>zjroland</UserName>
<Point>40</Point>
<ReplyNum>0</ReplyNum>
<PostTime>2005-12-02T09:58:00.0000000+08:00</PostTime>
</ForumPosts>
- <ForumPosts>
<PKID>1</PKID>
<Title>一次测试而已</Title>
<UserName>webteach</UserName>
<Point>50</Point>
<ReplyNum>2</ReplyNum>
<PostTime>2002-07-12T17:12:00.0000000+08:00</PostTime>
</ForumPosts>
</NewDataSet>代码如下:CComPtr<IXMLDOMDocument> spDoc;
hr = spDoc.CoCreateInstance(__uuidof(DOMDocument));
if (FAILED(hr))
{
MessageBox("CoCreateInstance failed.");
return;
}
// 装载XML文档。
VARIANT_BOOL varLoadSuccessful;
hr = spDoc->loadXML(bstrForumListXML, &varLoadSuccessful);
if (FAILED(hr) || varLoadSuccessful != VARIANT_TRUE)
{
MessageBox("Failed loading the XML stream into the DOM.");
return;
}
//spDoc->save(CComVariant("d:\\ForumListXml.xml"));
IXMLDOMNodeList *pIDOMNodeList = NULL;
IXMLDOMNode *pPostsNode = NULL;
IXMLDOMNodeList *pChildNodeList;
IXMLDOMNode *pIDOMNode = NULL;
long value;
BSTR bstrItemText;
BSTR tag = SysAllocString(L"ForumPosts"); hr = spDoc->getElementsByTagName(tag , &pIDOMNodeList);
hr = pIDOMNodeList->get_length(&value);
if(SUCCEEDED(hr))
{
long TotalItems;
pIDOMNodeList->reset();
for(int i = 0; i < value; i++)
{
m_softListMsg.InsertItem(i,"");
pIDOMNodeList->get_item(i,&pPostsNode);
pPostsNode->get_childNodes(&pChildNodeList);
hr=pChildNodeList->get_length(&TotalItems);
for(int j = 0; j < TotalItems; j++)
{
pChildNodeList->get_item(j, &pIDOMNode); //出现错误:读取时发生访问冲突。
if(pIDOMNode )
{
pIDOMNode->get_text(&bstrItemText);
CString strText = (CString)bstrItemText;
m_softListMsg.SetItemText(i, j, strText);
pIDOMNode->Release();
pIDOMNode = NULL;
}
pChildNodeList->Release();
pChildNodeList = NULL;
}
pPostsNode->Release();
pPostsNode = NULL;
}
}
pIDOMNodeList->Release();
pIDOMNodeList = NULL;
SysFreeString(tag);出现错误:读取位置 0x00000000000时发生访问冲突。出错位置上面已经标明,请大家看看错在哪里?
pPostsNode->get_childNodes(&pChildNodeList);
这一步出错了,因为不是都有子节点,要养成判断返回值的习惯
{
long TotalItems;
pIDOMNodeList->reset();
for(int i = 0; i < value; i++)
{
m_softListMsg.InsertItem(i,"");
pIDOMNodeList->get_item(i,&pPostsNode);
pPostsNode->get_childNodes(&pChildNodeList);
hr=pChildNodeList->get_length(&TotalItems);
for(int j = 0; j < TotalItems; j++)
{
pChildNodeList->get_item(j, &pIDOMNode);
if(pIDOMNode )
{
pIDOMNode->get_text(&bstrItemText);
CString strText = (CString)bstrItemText;
m_softListMsg.SetItemText(i, j, strText);
pIDOMNode->Release();
pIDOMNode = NULL;
}
}
pChildNodeList->Release();
pChildNodeList = NULL;
}
pPostsNode->Release();
pPostsNode = NULL;
}
pIDOMNodeList->Release();
pIDOMNodeList = NULL;
SysFreeString(tag);