MFC怎么读取XML文件

 我来答
huanglenzhi
2018-01-06 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517176
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部

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" 

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式