This application creates a simple, but complete, XML DOM object, with <root>
as the document element. This element contains three child elements: <node1>
, <node2>
, and <node3>
. The first child element contains character data. The second child element contains a CDATA section. The last child element contains three empty child elements: <subnode1>
, <subnode2>
,
and <subnode3>
.
Programmatically, the dynamDOMsmart application performs the following steps:
pXMLDom
).createProcessInstruction
method on pXMLDom
. This creates a processing instruction node (pi
) targeted for XML 1.0.appendChild
method on pXMLDom
. This adds the processing instruction node (pi
) to pXMLDom
.createComment
method on the DOM object (pXMLDom
) to create a comment node (pc
) and then append it pXMLDom
.<root>
element as the document element, with a created
attribute whose value is set to a string value of "using DOM"
. Adds this element (<root>
) to the DOM object (pXMLDom
).<node1>
element with some character data as its content. Appends this element (pe
) to the document element (documentElement
) of the DOM object (pXMLDom
).<node2>
element that contains a CDATA section (pcd
) with markup text. Appends this element (pe
) to the document element (documentElement
) of the DOM object (pXMLDom
).<node3>
element that contains a DOM document fragment (pdf
). This fragment contains three other empty child elements: <subNode1>
, <subNode2>
, and <subNode3>
. The code then appends this element (pe
) to the document element (documentElement
) of the DOM object (pXMLDom
).C/C++ Source File (dynamDOMsmart.cpp)
#include <stdio.h> #import <msxml5.dll> using namespace MSXML2; int main(int argc, char* argv[]) { IXMLDOMDocument3Ptr pXMLDom; HRESULT hr; CoInitialize(NULL); hr = pXMLDom.CreateInstance(__uuidof(DOMDocument50)); if (FAILED(hr)) { printf("Failed to CreateInstance on an XML DOM"); return NULL; } pXMLDom->preserveWhiteSpace = VARIANT_TRUE; // Create a processing instruction targeted for xml. IXMLDOMProcessingInstructionPtr pi; pi = pXMLDom->createProcessingInstruction("xml", "version='1.0'"); if (pi != NULL) { pXMLDom->appendChild(pi); pi.Release(); } // Create a processing instruction targeted for xml-stylesheet. pi = pXMLDom->createProcessingInstruction("xml-stylesheet", "type='text/xml' href='dom.xsl'"); if (pi != NULL) { pXMLDom->appendChild(pi); pi.Release(); } // Create a comment for the document. IXMLDOMCommentPtr pc; pc = pXMLDom->createComment("sample xml file created using XML DOM object."); if (pc != NULL) { pXMLDom->appendChild(pc); pc.Release(); } // Create the root element (i.e., the documentElement). IXMLDOMElementPtr pe; pe = pXMLDom->createElement("root"); // Create a "created" attribute for the root element and // assign the "using dom" character data as the attribute value. IXMLDOMAttributePtr pa; pa = pXMLDom->createAttribute("created"); if (pa != NULL) { pa->value = "using dom"; pe->setAttributeNode(pa); pa.Release(); } // Add the root element to the DOM instance. pXMLDom->appendChild(pe); pe.Release(); // Next, we will create and add more nodes to the root element // we've just created. // Create an element to hold text content. pe = pXMLDom->createElement("node1"); if (pe != NULL) { // Add newline + tab for indentation. pXMLDom->documentElement->appendChild(pXMLDom->createTextNode("\n\t")); pe->text = "some character data"; pXMLDom->documentElement->appendChild(pe); pe.Release(); } // Create an element to hold a CDATA section. pe=pXMLDom->createElement("node2"); if (pe != NULL) { // Add newline + tab for indentation. pXMLDom->documentElement->appendChild(pXMLDom->createTextNode("\n\t")); IXMLDOMCDATASectionPtr pcd; pcd = pXMLDom->createCDATASection("<some mark-up text>"); if (pcd != NULL) { pe->appendChild(pcd); pcd.Release(); } pXMLDom->documentElement->appendChild(pe); pe.Release(); } // Create an element to hold three empty subelements. pe=pXMLDom->createElement("node3"); if (pe != NULL) { // Add newline +tab for indentation. pXMLDom->documentElement->appendChild(pXMLDom->createTextNode("\n\t")); IXMLDOMDocumentFragmentPtr pdf; pdf = pXMLDom->createDocumentFragment(); pdf->appendChild(pXMLDom->createTextNode("\n\t\t")); pdf->appendChild(pXMLDom->createElement("subNode1")); pdf->appendChild(pXMLDom->createTextNode("\n\t\t")); pdf->appendChild(pXMLDom->createElement("subNode2")); pdf->appendChild(pXMLDom->createTextNode("\n\t\t")); pdf->appendChild(pXMLDom->createElement("subNode3")); pdf->appendChild(pXMLDom->createTextNode("\n\t")); pe->appendChild(pdf); pdf.Release(); pXMLDom->documentElement->appendChild(pe); pe.Release(); pXMLDom->documentElement->appendChild(pXMLDom->createTextNode("\n")); } printf("Dynamically created DOM:\n%s\n", (LPCSTR)pXMLDom->xml); hr = pXMLDom->save("dynaDom.xml"); if (FAILED(hr)) { printf("Failed to save DOM to dynaDom.xml\n"); } else { printf("DOM saved to dynamDom.xml\n"); } if (pXMLDom) pXMLDom.Release(); CoUninitialize(); return 0; }
To add the dynamDOM source code to the project
Next, build and run the dynamDOM project. The result should be the output shown in the following topic.