以前一直用C#写程序,最近换到C++下 ,习惯了C#的serialization和unserialization,对使用COM操作XML一直比较困惑,经过学习,原来也不过如此,现将简单实用的一些方法记录下来:
创建XML文档
void Create() 
...{
IXMLDOMDocumentPtr pDoc;
HRESULT hr =pDoc.CreateInstance(__uuidof(DOMDocument));
if(!SUCCEEDED(hr)) 
...{
cout <<" Create DOMDocument Failed ,Maybe the msxml Library is not installed!"<<endl;
return;
} 
IXMLDOMElementPtr pDocElement=pDoc->createElement("State");
pDoc->appendChild(pDocElement);
cout << "Generate Root:"<< (char*)pDoc->xml << endl; 
IXMLDOMElementPtr pNewChildElement; 
pNewChildElement=pDoc->createElement("Beijing"); //Append Node
pNewChildElement->Puttext("BJ"); //Set Text
pDocElement->appendChild(pNewChildElement);
cout << "Append Node:" << (char*)pDoc->xml << endl; 
pNewChildElement=pDoc->createElement("Shanxi");
pNewChildElement->Puttext("SX");
pNewChildElement->setAttribute("Resource",_variant_t("Mine")); //Set Attribute
pDocElement->appendChild(pNewChildElement);
cout << "Append Node With Attribute:" << (char*)pDoc->xml << endl; 
tmpXML = pDoc->xml; //Save To Globle Variant
pDoc->save(_variant_t("Test.xml")); //Save To Disk
pDocElement->removeChild (pNewChildElement);
cout << "Remove Node:" << (char*)pDoc->xml << endl;
} 加载xml文件
void Load() 
...{
IXMLDOMDocumentPtr pDoc;
HRESULT hr =pDoc.CreateInstance(__uuidof(DOMDocument));
if(!SUCCEEDED(hr)) 
...{
cout <<" Create DOMDocument Failed ,Maybe the msxml Library is not installed!"<<endl;
return;
}
pDoc->loadXML(tmpXML);
cout << "Read From Templete:" << (char*)pDoc->xml << endl;
IXMLDOMElementPtr pDocElement=pDoc->GetdocumentElement();
try
...{
IXMLDOMElementPtr pElement=pDocElement->selectSingleNode("Beijing");
cout<<"================================"<<endl;
cout<<"Beijing Has Text:"<<(char*)pElement->Gettext()<<endl; //Read Text
pElement = pDocElement->selectSingleNode("Shanxi");
cout<<"Shanxi Has Text:"<<(char*)pElement->Gettext()<<endl;
CComVariant varValue = pElement->getAttribute("Resource"); //Read Attribute
if ( varValue.vt ==VT_BSTR )
cout<<"Shanxi Has Attribute Resource:"<<(char*)(_bstr_t)(varValue.bstrVal)<<endl;
else
cout<<"Shanxi Has No Attribute Resource"<<endl;
cout<<"================================"<<endl;
pDocElement->removeChild(pElement);
cout << "Remove Node Beijing:" << (char*)pDoc->xml << endl;
}
catch ( _com_error& e ) 
...{
cout<<(char*)e.Source()<<endl;
}
catch (...)
...{
cout<<"UnKnow Error"<<endl;
}
} 要想程序可以正常运行,必须增加对msxml.dll这个COM的引用,如下代码
#import "msxml.dll"
#include <iostream>
using namespace MSXML;
using namespace std;

2310

被折叠的 条评论
为什么被折叠?



