下面是一个简单的例子
下面是save方法使用的一个简单的例子:
BOOL DOMDocSaveLocation()
{
BOOL bResult = FALSE;
IXMLDOMDocument *pIXMLDOMDocument = NULL;
HRESULT hr;
try
{
_variant_t varString = _T("D:\\sample.xml");
// 这里需要创建一个DOMDocument对象和装载XML文档,代码省略.
hr = pIXMLDOMDocument->save(varString); //保存文档到D:\\sample.xml中去。
if(SUCCEEDED(hr))
bResult = TRUE;
}
catch(...)
{
DisplayErrorToUser();
// 这里需要释放对IXMLDOMDocument接口的引用,代码省略。
}
return bResult;
}
例子2
IXMLDOMDocument *pIXMLDOMDocument = NULL;
wstring strFindText (_T("author"));
IXMLDOMNodeList *pIDOMNodeList = NULL;
IXMLDOMNode *pIDOMNode = NULL;
long value;
BSTR bstrItemText;
HRESULT hr;
try
{
// 创建一个DOMDocument文档对象,并装载具体文档,相关代码省略。
//下面的代码用来得到一个和标签名称author相关的所有的节点集合
hr = pIXMLDOMDocument->getElementsByTagName(
(TCHAR*)strFindText.data(), &pIDOMNodeList);
SUCCEEDED(hr) ? 0 : throw hr;
//是否正确的得到了指向IDOMNodeList的指针。
hr = pIDOMNodeList->get_length(&value); //得到所包含的NODE节点的个数
if(SUCCEEDED(hr))
{
pIDOMNodeList->reset();
for(int ii = 0; ii < value; ii++)
{
//得到具体的一个NODE节点
pIDOMNodeList->get_item(ii, &pIDOMNode);
if(pIDOMNode )
{
pIDOMNode->get_text(&bstrItemText); //得到该节点相关的文本信息
::MessageBox(NULL, bstrItemText,strFindText.data(), MB_OK);
pIDOMNode->Release();
pIDOMNode = NULL;
}
}
}
pIDOMNodeList->Release();
pIDOMNodeList = NULL;
}
catch(...)
{
if(pIDOMNodeList)
pIDOMNodeList->Release();
if(pIDOMNode)
pIDOMNode->Release();
DisplayErrorToUser();
}
简单的实例程序
#include < atlbase.h>
//下面的.h文件是在安装了最新的XML Parser以后所包含的.h文件。
#include "C:\Program Files\Microsoft XML Parser SDK\inc\msxml2.h"
#include < iostream>
void main()
{
// 初始化COM接口
CoInitialize(NULL);
//在程序中,我们假定我们装载的XML文件名称为xmldata.xml,它缺省的和可执行文
//件在同一个目录中。该文件的内容如下:
// < ?xml version="1.0"?>
// < xmldata>
// < xmlnode />
// < xmltext>Hello, World!< / xmltext>
// < /xmldata>
//
//程序将寻找名为“xmlnode”的节点,然后插入一个新的名称为“xmlchildnode”的
//节点,然后它去寻找一个名为“xmltest”的节点,然后提取包含在节点中的文本并显
//示它。最后它把新的改变过的XML文档保存在名称为“updatexml.xml”的文档中。
try {
// 通过智能指针创建一个解析器的实例。
CComPtr< IXMLDOMDocument> spXMLDOM;
HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
if ( FAILED(hr) ) throw "不能创建XML Parser对象";
if ( spXMLDOM.p == NULL ) throw "不能创建XML Parser对象";
// 如果对象创建成功的话,就开始装载XML文档
VARIANT_BOOL bSuccess = false;
hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
if ( FAILED(hr) ) throw "不能够在解析器中装载XML文档";
if ( !bSuccess ) throw "不能够在解析器中装载XML文档";
// 检查并搜索"xmldata/xmlnode"
CComBSTR bstrSS(L"xmldata/xmlnode");
CComPtr< IXMLDOMNode> spXMLNode;
//用接口IXMLDOMDocument的方法selectSingleNode方法定位该节点
hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
if ( FAILED(hr) ) throw "不能在XML节点中定位'xmlnode' ";
if ( spXMLNode.p == NULL ) throw "不能在XML节点中定位'xmlnode' ";
//DOM对象“spXMLNode”现在包含了XML节点< xmlnode>,所以我们可以在
//它下面创建一个子节点并把找到的该节点作为它的父节点。
CComPtr< IXMLDOMNode> spXMLChildNode;
//用接口IXMLDOMDocument的方法createNode方法创建一个新节点。
hr = spXMLDOM->createNode(
CComVariant(NODE_ELEMENT),
CComBSTR("xmlchildnode"),
NULL,&spXMLChildNode);
if ( FAILED(hr) ) throw "不能创建'xmlchildnode' 节点";
if ( spXMLChildNode.p == NULL )
throw "不能创建'xmlchildnode' 节点";
//添加新节点到spXMLNode节点下去。
CComPtr< IXMLDOMNode> spInsertedNode;
hr = spXMLNode->appendChild(spXMLChildNode,&spInsertedNode);
if ( FAILED(hr) ) throw "不能创建'xmlchildnode' 节点";
if ( spInsertedNode.p == NULL ) throw "不能移动'xmlchildnode' 节点";
//对新节点添加属性。
CComQIPtr< IXMLDOMElement> spXMLChildElement;
spXMLChildElement = spInsertedNode;
if ( spXMLChildElement.p == NULL )
throw "不能在XML元素接口中查询到'xmlchildnode' ";
//设置新节点的属性
hr = spXMLChildElement->setAttribute(CComBSTR(L"xml"),CComVariant(L"fun"));
if ( FAILED(hr) ) throw "不能插入新的属性";
//下面的程序段用来寻找一个节点并显示该节点的相关信息
// 查找"xmldata/xmltext"节点
spXMLNode = NULL; // 释放先前的节点
bstrSS = L"xmldata/xmltext";
hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
if ( FAILED(hr) ) throw "不能定位'xmltext'节点";
if ( spXMLNode.p == NULL ) throw "不能定位'xmltext'节点";
// 得到该节点包含的文本并显示它
CComVariant varValue(VT_EMPTY);
hr = spXMLNode->get_nodeTypedValue(&varValue);
if ( FAILED(hr) ) throw "不能提取'xmltext'文本";
if ( varValue.vt == VT_BSTR ) {
// 显示结果,注意这里要把字符串从形式BSTR转化为ANSI
USES_CONVERSION;
LPTSTR lpstrMsg = W2T(varValue.bstrVal);
std::cout < < lpstrMsg < < std::endl;
} // if
else {
// 如果出现错误
throw "不能提取'xmltext'文本";
} // else
//保存修改过的XML文档到指定的文档名
hr = spXMLDOM->save(CComVariant("updatedxml.xml"));
if ( FAILED(hr) ) throw "不能保存修改过的XML文档";
std::cout < < "处理完成..." < < std::endl < < std::endl;
} // try
catch(char* lpstrErr) {
// 出现错误
std::cout < < lpstrErr < < std::endl < < std::endl;
} // catch
catch(...) {
// 未知错误
std::cout < < "未知错误..." < < std::endl < < std::endl;
} // catch
// 结束对COM的使用
CoUninitialize();
}