VC++读取XML文件生成树

2008-03-31 11:32 A.M.
void CMonitorEmulationView::LoadTree()
... {
     HTREEITEM CityTree,CompTree;
    
char path[256];
     memset(path,
0,256);
     GetModuleFileName(NULL,path,
256);
    
     LPCTSTR urf
="TreeXML.xml";
     strcat(p,urf);

     xml::IXMLDOMDocumentPtr pXMLDoc(__uuidof(xml::DOMDocument));

  
if(!PathFileExists(path))
        
return;
    
try
    
...{
         pXMLDoc
->load(path);
     }


    
catch(_com_error& e)
    
...{
         MessageBox(
"文件读取失败: " + e.Description(), "错误", MB_ICONWARNING);
           
return;
     }

    

     xml::IXMLDOMNodeListPtr pNodeList
=NULL;

     xml::IXMLDOMElementPtr spElement;
     HRESULT hr
= pXMLDoc->get_documentElement(&spElement);   //获取根结点

     CComBSTR strTagName;

     hr
= spElement->get_tagName(&strTagName);

     xml::IXMLDOMNodeListPtr spNodeList;

     hr
= spElement->get_childNodes(&spNodeList);   //获取子结点列表

    
long lCount;                                       

     hr
= spNodeList->get_length(&lCount);

    
for (long i=0; i<lCount; ++i)
    
...{
         CComVariant varNodeValue;

         xml::IXMLDOMNodePtr spNode;
         xml::DOMNodeType NodeType;
         xml::IXMLDOMNodeListPtr spChildNodeList;
         hr
= spNodeList->get_item(i, &spNode);         //获取结点
         hr = spNode->get_nodeType(&NodeType);     //获取结点信息的类型
         xml::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
         xml::IXMLDOMNodePtr pAttrItem;
         spNode
->get_attributes(&pAttrs);
        
long nCount ;
         pAttrs
->get_length(&nCount);
        
for(int i = 0 ; i < nCount ; i++)
        
...{                 
             pAttrs
->get_item(i,&pAttrItem);
            
//我们可以通过函数get_nodeName,get_nodeTypedValue得到属性名和属性值
            
//也可以直接得到
             CString strAttrName   = (char*)(_bstr_t)pAttrItem->nodeName;
             CString strAttrValue  
= (char*)(_bstr_t)pAttrItem->nodeTypedValue;
             CityTree
=m_wndTreeCtrl.InsertItem(_bstr_t(strAttrValue),userItem[0]);//父项1插入子项
         }


        
if (NODE_ELEMENT == NodeType)
        
...{
             hr
= spNode->get_childNodes(&spChildNodeList);
            
long childLen;
             hr
= spChildNodeList->get_length(&childLen);
            
for (int j=0; j<childLen; ++j)
            
...{
                 xml::IXMLDOMNodePtr spChildNode;
                 CComBSTR value;
                 hr
= spChildNodeList->get_item(j, &spChildNode);
                 hr
= spChildNode->get_nodeName(&value);            //获取结点名字
                 hr = spChildNode->get_text(&value);                //获取结点的值
                
                 CString strValue
=(char*)(_bstr_t)value;
                 strValue.TrimRight();

                 CompTree
=m_wndTreeCtrl.InsertItem((_bstr_t)strValue,CityTree);//父项1插入子项

                 spChildNode.Release();
             }

         }

         spNode.Release();
         spChildNodeList.Release();
     }

     spNodeList.Release();
     spElement.Release();
     pXMLDoc.Release();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值