运行环境为vs2005,msxml3.0
下面是我们要读取的一个XML文档text.xml.
- <?xml version="1.0" encoding="gb2312"?>
- <xmlRoot>
- <Item Start="天津" Aim="南京" Date="2008/12/15"/>
- <Item Start="南京" Aim="北京" Date="2008/12/15"/>
- <Item Start="天津" Aim="海南" Date="2008/12/16"/>
- </xmlRoot>
下面是程序的主要代码:
- MSXML2::IXMLDOMDocumentPtr xmldoc = NULL;
- MSXML2::IXMLDOMNodeList* pNodeList = NULL;
- VARIANT_BOOL isread = VARIANT_FALSE;
- long nodes = 0;
- CoInitialize(NULL);
- if(!SUCCEEDED(xmldoc.CreateInstance(__uuidof(MSXML2::DOMDocument30))))
- {
- printf("组件初始化失败!");
- return -1;
- }
- VARIANT var_src;
- BSTR src = SysAllocString(L"text.xml");
- V_BSTR(&var_src) = SysAllocString(src);
- V_VT(&var_src) = VT_BSTR;
- xmldoc->load(var_src,&isread);
- if(isread != VARIANT_TRUE)
- {
- printf("XML文件读取错误!");
- return -1;
- }
- xmldoc->selectNodes(L"//xmlRoot//Item",&pNodeList);
- if(pNodeList == NULL)
- {
- printf("结点选取错误!");
- return -1;
- }
- pNodeList->get_length(&nodes);
- for(int i = 0;i<nodes;i++)
- {
- MSXML2::IXMLDOMNode *pNode = NULL;
- MSXML2::IXMLDOMNamedNodeMap *pAttribs = NULL;
- long attribs = 0;
- pNodeList->get_item(i,&pNode);
- pNode->get_attributes(&pAttribs);
- pAttribs->get_length(&attribs);
- for(int j=0;j<attribs;j++)
- {
- MSXML2::IXMLDOMNode *pAttrib = NULL;
- BSTR str;
- VARIANT var;
- pAttribs->get_item(j,&pAttrib);
- pAttrib->get_nodeName(&str);
- pAttrib->get_nodeValue(&var);
- setlocale(LC_CTYPE, "");
- printf("%S:%S/t",str,var.bstrVal);
- SysFreeString(str);
- VariantClear(&var);
- pAttrib->Release();
- }
- printf("/n");
- pNode->Release();
- pAttribs->Release();
- }
- pNodeList->Release();
- VariantClear(&var_src);
- xmldoc.Release();
- CoUninitialize();
代码比较简单,所要提醒的是因为xmldoc是一个智能指针,所以当它被释放,重新赋值的时候都会将原来的所指向的内容释放,也就是是会调用内部指针的Release()所以。在xmldoc.Release()之前不要调用xmldoc->Release()或是CoUninitialize()之类会释放内部指针所指对象的方法.否者会发生异常。