有个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时发生访问冲突。出错位置上面已经标明,请大家看看错在哪里?

解决方案 »

  1.   

    应该是某个地方pChildNodeList = NULL, 加一个判断吧
      

  2.   

    加判断后确实是pChildNodeList = NULL,j=1后就出错了。不知怎么回事?
      

  3.   

    我估计
    pPostsNode->get_childNodes(&pChildNodeList);
    这一步出错了,因为不是都有子节点,要养成判断返回值的习惯
      

  4.   

    仔细看了你的代码,发现是提前 Release 了,改为:    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);