[技术学习]基于MSXML实现DOM操作的VC++代码

 

最近学习了MSXML中DOM操作,写了一些代码,贴在这里,方便以后复习。

// 从配置模板中导出ITEM元素 void DicEntryConfig::tempt2DicEntry(const CString strFileName, const CString strDicName, const CString strIsbn ) { CString strErrMsg; try { HRESULT hr = m_pInDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if (FAILED(hr)) { strErrMsg.Format(L"创建DOM实例失败 [File: %s Line: %d ] 失败。/n",__FILE__,__LINE__); throw CPamException(strErrMsg); } hr = m_pOutDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if (FAILED(hr)) { strErrMsg.Format(L"创建DOM实例失败 [File: %s Line: %d ] 失败。/n",__FILE__,__LINE__); throw CPamException(strErrMsg); } m_pOutDoc->async = VARIANT_FALSE; m_pOutDoc->preserveWhiteSpace = VARIANT_TRUE; if(VARIANT_FALSE == (m_pInDoc->load((LPCWSTR)strFileName)) ) { strErrMsg.Format(L"读取模板配置文件 [ %s ] 失败。/n错误原因:装载XML文件失败。",strFileName); throw CPamException(strErrMsg); } // 建立根节点 MSXML2::IXMLDOMElementPtr pRootElement = m_pOutDoc->createElement(L"root"); _ASSERT(pRootElement != NULL); m_pOutDoc->appendChild(pRootElement); // 输出 <dirictory name="XX" isbn="710003308X"/> MSXML2::IXMLDOMElementPtr pTmpElement = m_pOutDoc->createElement(L"dirictory"); pTmpElement->setAttribute("name",(LPCWSTR)strDicName); pTmpElement->setAttribute("isbn",(LPCWSTR)strIsbn); pRootElement->appendChild(pTmpElement); //查找<ITEM>结点 MSXML2::IXMLDOMNodeListPtr pItemNodes = m_pInDoc->selectNodes(L"/ROOT/ITEM"); if (pItemNodes == NULL || pItemNodes->length == 0) { strErrMsg.Format(L"读取模板配置文件失败。/n错误原因:找不到[ /ROOT/ITEM ]结点。"); throw CPamException(strErrMsg); } // 遍历输入模板的ITEM节点 for(int i = 0; i < pItemNodes->length; i++) { MSXML2::IXMLDOMNodePtr pItemNode = pItemNodes->item[i]; _ASSERT(pItemNode != NULL); CString strXpath; CComBSTR bstrName; CComBSTR bstrLevel; strXpath.Format(_T("./@name")); MSXML2::IXMLDOMNodePtr pNameAttr = pItemNode->selectSingleNode((LPCTSTR)strXpath); pNameAttr->get_text(&bstrName); strXpath.Format(_T("./@level")); MSXML2::IXMLDOMNodePtr pLevelAttr = pItemNode->selectSingleNode((LPCTSTR)strXpath); pLevelAttr->get_text(&bstrLevel); pTmpElement = m_pOutDoc->createElement(_T("item")); _ASSERT(pTmpElement != NULL); pTmpElement->setAttribute("name",(LPCWSTR)(CString(bstrName))); pTmpElement->setAttribute("level",(LPCWSTR)(CString(bstrLevel))); pRootElement->appendChild(pTmpElement); } m_pOutDoc->save("dictionaryEntryTreeConfig.xml"); } catch(...) { //CPamException& exception = ConvertToPamException(e); //strErrMsg.Format(L"转换配置文件错误。/n错误原因:/n%s",exception.what()); MessageBox(NULL, _T("DicEntryConfig::tempt2DicEntry!"), _T("Exception"), MB_OK | MB_ICONERROR); throw CPamException(strErrMsg); } } //DicEntryConfig::tempt2DicEntry

 

代码说明:
      02~04行: strFileName读入的XML配置文件名
                         strDicName字典名
                         字典ISBN号
      08~19行:  分别为输入和输出的XML文件创建DOM对象,MSXML也是用COM封装的,创建DOM对象须用到恶心的CreateInstance。

      22行: 载入输入配置文件
                 配置文件格式
                 <ROOT>
            <ITEM level="1" name="id">
                               <CONDITION ... >
                                ... ...
                                </CONDITION>
                        </ITEM>
                </ROOT>
      27~42行: 在输出文件中建立如下形式的结点结构:
                <root>
                      <directory name="字典名" isbn="ISBN号" />
                </root>
             
     36~62行: 利用XPath语句遍历输入文件的ITEM结点,并在输出文件建立相对应的结点。
  
     63行: 将DOM文档结构保存到文件dictionaryEntryTreeConfig.xml。

 

你可能感兴趣的:([技术学习]基于MSXML实现DOM操作的VC++代码)