利用MSXML解析XML文本(四)

下面是一个简单的例子

  下面是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();

  }

你可能感兴趣的:(利用MSXML解析XML文本(四))