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/目录下,然后通过代码获取程序初始目录找到该配置文件即可。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存