<?xml version="1.0" encoding="utf-8"?> <Cases> <case> <No>001</No> <CopyFile src="C:\test.txt" dest="D:\test.txt"></CopyFile> </case> <case> <No>002</No> <DelFile>C:\test.txt</DelFile> </case> </Cases>
我們用MFC來讀取上述xml,代碼如下:
void CXXXDlg::ReadXml(CString strXmlPath) { MSXML2::IXMLDOMDocumentPtr pDoc; ::CoInitialize(NULL); HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument40)); if (!SUCCEEDED(hr)) { MessageBox(_T("創建DOMDocument對象失敗。\n請檢查運行環境"), _T("錯誤"), MB_ICONERROR); return; } // 讀取xml pDoc->put_async(VARIANT_FALSE); VARIANT_BOOL bhr = pDoc->load((_variant_t)strXmlPath); if (bhr != VARIANT_TRUE) { MessageBox(_T("無法正確讀取xml文件"), _T("錯誤"), MB_ICONERROR); return; } // 根節點取得 MSXML2::IXMLDOMElementPtr root = pDoc->documentElement; // 取得根節點的名字 _variant_t strRootName = root->nodeName; _bstr_t wstrRootName(strRootName.bstrVal); MSXML2::IXMLDOMNodeListPtr nodeList = root->GetchildNodes();//cases // 解析cases的子節點 ReadCases(nodeList); } void CXXXDlg::ReadCases(MSXML2::IXMLDOMNodeListPtr nodeList) { int ilength = nodeList->Getlength(); for (int nodeCount = 0; nodeCount < ilength; nodeCount++) { MSXML2::IXMLDOMNodePtr nodePtr = nodeList->nextNode(); _variant_t strNodeName = nodePtr->GetnodeName(); _variant_t strNodeValue = nodePtr->GetnodeValue(); // 讀取case節點下的子節點 ReadCase(nodePtr->GetchildNodes()); } } void CXXXDlg::ReadCase(MSXML2::IXMLDOMNodeListPtr nodeList) { CString strLogInfo; strLogInfo.Empty(); CString strNo; // case編號 CString strSrcFile; // 源文件 CString strDestFile; // 目標文件 for (int nodeCount = 0; nodeCount < nodeList->Getlength(); nodeCount++) { MSXML2::IXMLDOMNodePtr nodePtr = nodeList->nextNode(); _variant_t strCaseNodeName = nodePtr->GetnodeName(); _variant_t strCaseNodeValue = nodePtr->Gettext(); BSTR bStrTemp = strCaseNodeName.bstrVal; CString strTemp = CString(bStrTemp); SysFreeString(bStrTemp); CString strNodeName = strTemp; // 節點的值,如何取得? if (0 == strNodeName.CompareNoCase(_T("NO"))) { strNo = (BSTR)strCaseNodeValue.pbstrVal; // 取得的值可以打印出來 printf(strNo); } // 節點有屬性值,該怎么處理? else if (0 == strNodeName.CompareNoCase(_T("CopyFile"))) { strSrcFile.Empty(); strDestFile.Empty(); // 取得節點的屬性值 MSXML2::IXMLDOMNamedNodeMapPtr pDOMAttrList= nodePtr->Getattributes(); for (int j = 0; j < pDOMAttrList->Getlength(); j++) { MSXML2::IXMLDOMNodePtr pDOMAttr= pDOMAttrList->Getitem(j); // 取得源文件路徑 if (CompareNoCase((char*)pDOMAttr->GetnodeName(), _T("src"))) { strSrcFile = pDOMAttr->GetnodeTypedValue(); // 取得目標文件路徑 } else if (CompareNoCase((char*)pDOMAttr->GetnodeName(), _T("dest"))) { strDestFile =pDOMAttr->GetnodeTypedValue(); } printf("strSrcFile = %s\n", strSrcFile); printf("strDestFile = %s\n", strDestFile ); } else if (0 == strNodeName.CompareNoCase(_T("DelFile"))) { strDestFile.Empty(); strDestFile = CString((BSTR)strCaseNodeValue.pbstrVal); printf("strDestFile = %s\n", strDestFile ); } } }
為了能夠讓MFC認識MSXML2,我們需要引入相應的dll,代碼如下;
#import "msxml4.dll"