C++如何 *** 作XML配置文件

C++如何 *** 作XML配置文件,第1张

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

 

我们用C++来读取上述xml,代码如下:

  

void CTestToolsDlg::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 CTestToolsDlg::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 CTestToolDlg::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()

                }

                 

                CopyFile(strSrcFile, strDestFile, FALSE)

            }

            else if (0 == strNodeName.CompareNoCase(_T("DelFile")))

            {

                strDestFile.Empty()

                strDestFile = CString((BSTR)strCaseNodeValue.pbstrVal)

                 

                DeleteFile(strDestFile)

            } 

        }

    }

为了能够让C++认识MSXML2,我们需要引入相应的dll,代码如下#import "msxml4.dll"

据分析,你的dll类库生成后应该是一些dll文件供winform程序调用,但是生成的时候并没有把xml文件生成到dll中去,所以你生成安装文件之后这些xml文件应该没有包含在你的安装程序中,所以会出现如你所说的错误信息,解决方案:可以把配置文件放到winform项目程序中的bin/debug/目录下,然后通过代码获取程序初始目录找到该配置文件即可。

“C:\Windows”目录里有不少东西可删除。在这个目录下,.BAK、.BMP、.OLD、.TMP类型的文件可以删除。除SchedLgU.txt(它被用于计划任务程序服务),.TXT文件也可删除。Notepad.exe和TASKMAN.exe也可删除,因为在“System32”目录下还有一个备份。另外,clock.avi、Control.ini文件也可删除,它不会对系统造成任何影响。

C:\Windows\$NtUninstall$这是在线升级Windows时,系统自动创建的目录,可以删除.

C:\Windows\Cursors这个目录里是鼠标方案,如果用不上,就删吧。

C:\Windows\Help在第一次运行Windows XP时,系统总会提示运行“漫游Windows XP”,中文版使用的是一个HTML格式的文件,只有文件,没有声音。其实在系统中还安装英文版的漫游功能,虽然是英文,但有语言,有音乐,还有漂亮的动画。它就是“Tours/mmtour”目录中的“tour.exe”。如果没有用了,则可将“Tours”整个目录删掉。在这之前,应先在“C:\Windows\ System32\dllcache”中删除“tourstrt.exe、tourW.exe以及“C:\Windows\ System32”目录下的“tourstart.exe”文件。

C:\Windows\inf在这个目录中会看到很多相同文件名,不同后缀的文件,分别为.inf和.pnf ,.pnf是.inf文件的预编译文件,这个目录的所有.pnf文件都可以删除。

C:\Windows\Media这是系统自带的一些MID和WAV音效,喜欢的留下,不喜欢的也可删除。

C:\Windows\Temp这是临时文件夹,当然可删除。但有一点要注意,最好是在启动系统后才删除,因为有很多软件的安装程序会在重新新启动后利用这里的文件来完成最后的安装。

C:\Windows\Web这里的“gif”和“htm”文件均可删除。到“Wallpaper”目录中看看,系统自带的大部分桌面背景都在这里,不喜欢的均可删除。

C:\Windows\System32这里有很多名如“1033”的文件夹,这些主要存放系统出现的错误报告,其中大部分是空文件夹,这些空文件夹可放心删除。

C:\Windows\System32\Direct\Dinput这个目录里的文件主要是游戏设备的配置文件,如果用不上,就删吧。

C:\Windows\System32\ReinstallBackups这里有很多子目录,在它下面有AUTOEXEC.BAT、CONFIG.SYS、IO.SYS和MSDOS.SYS这四个文件,如果为0字节,则可删除。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7942975.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存