现在的位置: 首页 > 综合 > 正文

XMLDOM的CComPtr的例程

2012年08月15日 ⁄ 综合 ⁄ 共 4131字 ⁄ 字号 评论关闭

具体可以参考:
// XMLNodeExerciser.cpp
//
// Locates a specific XML node in an XML document and inserts
// a new child node, with an attribute, therein.
//
#include <atlbase.h>
#include <msxml.h>
#include <iostream>

void main()
{
 // Start COM
 CoInitialize(NULL);

 // Open the file...note this simplistic executable
 // assumes the file is named "xmldata.xml" and is
 // in the same directory as the executable.  It
 // further assumes the file looks like this:
 //
 // <?xml version="1.0"?>
 // <xmldata>
 //    <xmlnode />
 //    <xmltext>Hello, World!</ xmltext>
 // </xmldata>
 //
 // The executable will find the node "xmlnode"
 // and insert a new node "xmlchildnode" (with the
 // attribute 'xml="fun"') if everything
 // works as expected. It then finds the node
 // "xmltext" and retrieves the text contained
 // within the node and displays that. Finally, it
 // saves the XML document into a new file named
 // "updatedxml.xml".
 try {
  // Create an instance of the parser
  CComPtr<IXMLDOMDocument> spXMLDOM;
  HRESULT hr = spXMLDOM.CoCreateInstance(__uuidof(DOMDocument));
  if ( FAILED(hr) ) throw "Unable to create XML parser object";
  if ( spXMLDOM.p == NULL ) throw "Unable to create XML parser object";

  // Load the XML document file...
  VARIANT_BOOL bSuccess = false;
  hr = spXMLDOM->load(CComVariant(L"xmldata.xml"),&bSuccess);
  if ( FAILED(hr) ) throw "Unable to load XML document into the parser";
  if ( !bSuccess ) throw "Unable to load XML document into the parser";

  // Check for <xmldata>
  //              <xmlnode>...
  //
  // Construct search string
  //  "xmldata/xmlnode"
  CComBSTR bstrSS(L"xmldata/xmlnode");
  CComPtr<IXMLDOMNode> spXMLNode;
  hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
  if ( FAILED(hr) ) throw "Unable to locate 'xmlnode' XML node";
  if ( spXMLNode.p == NULL ) throw "Unable to locate 'xmlnode' XML node";

  // The COM object "spXMLNode" now contains the XML
  // node <xmlnode>, so we create a child node at
  // this point...  The DOM creates the node itself,
  // then we place it using the XML node we located as
  // the parent.
  CComPtr<IXMLDOMNode> spXMLChildNode;
  hr = spXMLDOM->createNode(CComVariant(NODE_ELEMENT),CComBSTR("xmlchildnode"),NULL,&spXMLChildNode);
  if ( FAILED(hr) ) throw "Unable to create 'xmlchildnode' XML node";
  if ( spXMLChildNode.p == NULL ) throw "Unable to create 'xmlchildnode' XML node";

  // Place the node...if all goes well, the two nodal
  // parameters provided to appendChild will be the
  // same node. If there is a problem, the "inserted"
  // node's pointer will be NULL.
  CComPtr<IXMLDOMNode> spInsertedNode;
  hr = spXMLNode->appendChild(spXMLChildNode,&spInsertedNode);
  if ( FAILED(hr) ) throw "Unable to move 'xmlchildnode' XML node";
  if ( spInsertedNode.p == NULL ) throw "Unable to move 'xmlchildnode' XML node";

  // Add the attribute. Note we do this through the IXMLDOMElement
  // interface, so we need to do the QI().
  CComQIPtr<IXMLDOMElement> spXMLChildElement;
  spXMLChildElement = spInsertedNode;
  if ( spXMLChildElement.p == NULL ) throw "Unable to query for 'xmlchildnode' XML element interface";

  hr = spXMLChildElement->setAttribute(CComBSTR(L"xml"),CComVariant(L"fun"));
  if ( FAILED(hr) ) throw "Unable to insert new attribute";

  // Check for <xmldata>
  //              <xmltext>...
  //
  // Construct search string
  //  "xmldata/xmltext"
  spXMLNode = NULL; // release previous node...
  bstrSS = L"xmldata/xmltext";
  hr = spXMLDOM->selectSingleNode(bstrSS,&spXMLNode);
  if ( FAILED(hr) ) throw "Unable to locate 'xmltext' XML node";
  if ( spXMLNode.p == NULL ) throw "Unable to locate 'xmltext' XML node";

  // Pull the enclosed text and display
  CComVariant varValue(VT_EMPTY);
  hr = spXMLNode->get_nodeTypedValue(&varValue);
  if ( FAILED(hr) ) throw "Unable to retrieve 'xmltext' text";

  if ( varValue.vt == VT_BSTR ) {
   // Display the results...since we're not using the
   // wide version of the STL, we need to convert the
   // BSTR to ANSI text for display...
   USES_CONVERSION;
   LPTSTR lpstrMsg = W2T(varValue.bstrVal);
   std::cout << lpstrMsg << std::endl;
  } // if
  else {
   // Some error
   throw "Unable to retrieve 'xmltext' text";
  } // else

  // If we got this far, we've inserted the new node, so
  // save the resulting XML document...
  hr = spXMLDOM->save(CComVariant("updatedxml.xml"));
  if ( FAILED(hr) ) throw "Unable to save updated XML document";

  // Write a note to the screen...
  std::cout << "Processing complete..."  << std::endl << std::endl;
 } // try
 catch(char* lpstrErr) {
  // Some error...
  std::cout << lpstrErr << std::endl << std::endl;
 } // catch
 catch(...) {
  // Unknown error...
  std::cout << "Unknown error..." << std::endl << std::endl;
 } // catch

 // Stop COM
 CoUninitialize();
}

 

抱歉!评论已关闭.