zoukankan      html  css  js  c++  java
  • MFC如何读取XML

    <?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" 

    高山流水,海纳百川!
  • 相关阅读:
    CSS3—— 2D转换 3D转换 过渡 动画
    CSS3——边框 圆角 背景 渐变 文本效果
    CSS3——表单 计数器 网页布局 应用实例
    CSS3——提示工具 图片廓 图像透明 图像拼接技术 媒体类型 属性选择器
    CSS3——对齐 组合选择符 伪类 伪元素 导航栏 下拉菜单
    CSS3——分组和嵌套 尺寸 display显示 position定位 overflow float浮动
    CSS3——盒子模型 border(边框) 轮廓(outline)属性 margin外边距 padding填充
    Eclipse连接数据库报错Local variable passwd defined in an enclosing scope must be final or effectively final
    数据库——单表查询
    数据库——添加,修改,删除
  • 原文地址:https://www.cnblogs.com/ahcc08/p/6082470.html
Copyright © 2011-2022 走看看