• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            笑看風云淡

            寵辱不驚,看庭前花開花落;去留無意,望天空云卷云舒
            posts - 96, comments - 48, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

            使用MSXML在VC++中解析XML文件

            Posted on 2009-08-25 15:29 天之驕子 閱讀(5140) 評論(0)  編輯 收藏 引用

            好久沒有在VC++里面解析XML了,昨天遇到一個問題,從昨天下午一直到今天上午,差不多搞了一天,才終于把問題解決了。
            使用MSXML在VC++中解析XML文件時候,只需要做到下面幾點:
            1、初始化COM庫,CoInitialize(NULL);可以放在InitInstance()函數里面。釋放COM庫,CoUninitialize();可以放在ExitInstance()函數里面。
            2、在頭文件里面加入如下代碼

            #import "MSXML6.dll" rename_namespace("MSXML6") named_guids
            using namespace MSXML6;
            因為解析的時候要用到CComVariant類,所以還要加上
            #include <atlbase.h>
            3、解析XML文件。
            需要解析的XML文件如下:
            <?xml version="1.0" encoding="UTF-8"?>
            <SCL xmlns="http://www.iec.ch/61850/2003/SCL">
                
            <Address type="MAC-Address" xsi:type="tP_MAC-Address">
                01-0C-CD-01-00-08
            </Address>
            </SCL>
            首先要加載XML文件,代碼如下:
                HRESULT hr;
                IXMLDOMDocument 
            *pDoc=NULL;

                CString strFileName;
                
                CFileDialog fileDlg(TRUE);
                fileDlg.m_ofn.lpstrTitle
            ="打開XML文件";
                fileDlg.m_ofn.lpstrFilter
            ="XML Files(*.xml)\0*.xml\0All Files(*.*)\0*.*\0\0";
                fileDlg.m_ofn.lpstrDefExt
            ="xml";
                
            if(fileDlg.DoModal() != IDOK)
                    
            return;
                strFileName
            =fileDlg.GetPathName();        //獲得要解析的XML文件的路徑名
                ASSERT(!strFileName.IsEmpty());

                
            if(SUCCEEDED(CoCreateInstance(CLSID_DOMDocument,NULL,
                    CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(
            void**)&pDoc)))    //創建Document對象
                {
                    CComVariant vPath(strFileName);
                    VARIANT_BOOL isSuccessful;
                    pDoc
            ->raw_load(vPath,&isSuccessful);    //加載要解析的XML文件
                    if(isSuccessful!=VARIANT_TRUE)
                    
            {
                        AfxMessageBox(
            "wrong!");
                        
            return;
                    }

                }
            我當時在加載XML文件的時候老是報錯,本來以為是代碼的問題,找了半天都沒問題呀。后來發現XML文件的問題,問題出在xsi:type上,如果將xsi:type改成別的(比如ype就可以了);或者是在根元素里面定義好xsi的意義,修改后的XML文件如下
            <?xml version="1.0" encoding="UTF-8"?>
            <SCL xmlns="http://www.iec.ch/61850/2003/SCL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                
            <Address type="MAC-Address" xsi:type="tP_MAC-Address">
                01-0C-CD-01-00-08
            </Address>
            </SCL>
            現在加載XML文件已經沒有問題了,下面就是解析XML文件了。我所做的工作是得到元素Address的兩個屬性的名稱type和xsi:type,以及它們的屬性值。
            我原來的解析代碼是:
                IXMLDOMElement *pRootElement=NULL;
                IXMLDOMNode 
            *pRootNode=NULL;

                IXMLDOMNamedNodeMap 
            *pAttrMap=NULL;
                IXMLDOMNode 
            *pAttrNode=NULL;
                IXMLDOMNode 
            *pAddrNode=NULL;

                CString strName,strText;
                BSTR bsName,bsText;

                hr
            =pDoc->get_documentElement(&pRootElement);
                
            if(SUCCEEDED(hr) && (pRootElement!=NULL))
                
            {
                    hr
            =pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pRootNode);
                    
            if(SUCCEEDED(hr))
                    
            {

                        hr
            =pRootNode->get_firstChild(&pAddrNode);
                        
            if(SUCCEEDED(hr) && (pAddrNode!=NULL))
                        
            {
                            pAddrNode
            ->get_attributes(&pAttrMap);
                            
                            
            long length=0;
                            pAttrMap
            ->get_length(&length);
                            
            for(int i=0;i<length;i++)
                            
            {
                                hr
            =pAttrMap->get_item(i,&pAttrNode);
                                
            if(SUCCEEDED(hr) && (pAttrNode!=NULL))
                                
            {
                                    pAttrNode
            ->get_baseName(&bsName);
                                    pAttrNode
            ->get_text(&bsText);
                                    strName
            =bsName;
                                    strText
            =bsText;
                                    
                                    SysFreeString(bsName);
                                    SysFreeString(bsText);
                                }

                            }

                        }

                    }

                }
            后來調試的時候發現,對xsi:type屬性節點調用get_basename()方法,得到的是type,而不是xsi:type;當然對type屬性節點調用get_basename()方法,得到的是type,這個正常。后來我改用IXMLDOMNode的get_nodeName()方法,才把問題解決了。對xsi:type屬性節點調用get_nodename()方法,得到的是xsi:type;對type屬性節點調用get_nodename()方法,得到的是type。
            修改后的VC++代碼如下
                IXMLDOMElement *pRootElement=NULL;
                IXMLDOMNode 
            *pRootNode=NULL;

                IXMLDOMNamedNodeMap 
            *pAttrMap=NULL;
                IXMLDOMNode 
            *pAttrNode=NULL;
                IXMLDOMNode 
            *pAddrNode=NULL;

                CString strName,strText;
                BSTR bsName,bsText;

                hr
            =pDoc->get_documentElement(&pRootElement);
                
            if(SUCCEEDED(hr) && (pRootElement!=NULL))
                
            {
                    hr
            =pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pRootNode);
                    
            if(SUCCEEDED(hr))
                    
            {

                        hr
            =pRootNode->get_firstChild(&pAddrNode);
                        
            if(SUCCEEDED(hr) && (pAddrNode!=NULL))
                        
            {
                            pAddrNode
            ->get_attributes(&pAttrMap);
                            
                            
            long length=0;
                            pAttrMap
            ->get_length(&length);
                            
            for(int i=0;i<length;i++)
                            
            {
                                hr
            =pAttrMap->get_item(i,&pAttrNode);
                                
            if(SUCCEEDED(hr) && (pAttrNode!=NULL))
                                
            {
                                    pAttrNode
            ->get_nodeName(&bsName);
                                    pAttrNode
            ->get_text(&bsText);
                                    strName
            =bsName;
                                    strText
            =bsText;
                                    
                                    SysFreeString(bsName);
                                    SysFreeString(bsText);
                                }

                            }

                        }

                    }

                }
            国产成人久久精品激情| 国产成人综合久久精品尤物| 亚洲AV无码1区2区久久| 久久av高潮av无码av喷吹| 国产精品久久成人影院| 俺来也俺去啦久久综合网| 无码国内精品久久综合88| 久久亚洲视频| 亚洲精品乱码久久久久久蜜桃不卡| 一本大道久久东京热无码AV | 精品久久久久久无码免费| 99久久人妻无码精品系列 | 久久无码人妻一区二区三区午夜| 午夜精品久久久久久久| 天天爽天天狠久久久综合麻豆| 伊人久久综合无码成人网| 狠狠色丁香久久综合婷婷| 国产精品成人99久久久久91gav| 99久久国产免费福利| 久久强奷乱码老熟女网站| 欧美日韩中文字幕久久伊人| 亚洲乱码日产精品a级毛片久久| 久久婷婷五月综合成人D啪| 精品久久久久久久国产潘金莲| 久久99久久99精品免视看动漫| 久久夜色精品国产噜噜亚洲AV| 国产精品免费福利久久| 亚洲欧美精品伊人久久| 一级做a爰片久久毛片毛片| 久久精品毛片免费观看| 三级三级久久三级久久| 精品久久久噜噜噜久久久| 狠狠人妻久久久久久综合| 亚洲愉拍99热成人精品热久久| 久久婷婷久久一区二区三区| 女同久久| 99久久99久久久精品齐齐| 免费无码国产欧美久久18| 久久91精品国产91久久户| 国产香蕉久久精品综合网| 青青草原1769久久免费播放|