VC++读取XML文件生成树

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值