TXMLDocument use case (C++)

From RAD Studio Code Examples
Jump to: navigation, search

Description

The following example illustrates the basic operations on an XML document.

Code

#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
#include <XMLDoc.hpp>
#include <XMLIntf.hpp>
#include <ComObj.hpp>
#include <stdio.h>

#pragma argsused

void CreateDocument();
void RetrieveDocument();
const _TCHAR* destPath = _TEXT("../../dest.xml"); // File should exist.
const _TCHAR* srcPath = destPath;

int _tmain(int argc, _TCHAR* argv[]) {

	CoInitializeEx(NULL, 0);

	try {
		CreateDocument();
		RetrieveDocument();
	}
	catch (Exception &ex) {
		printf("Exception message: %ls\n", ex.Message);
	}

	return 0;
}

void CreateDocument() {
	_di_IXMLDocument document = interface_cast<Xmlintf::IXMLDocument>
		(new TXMLDocument(NULL));
	document->Active = true;

	// Define document content.
	document->DocumentElement = document->CreateNode("ThisIsTheDocumentElement",
		ntElement, "");
	document->DocumentElement->Attributes["attrName"] = "attrValue";
	_di_IXMLNode nodeElement = document->DocumentElement->AddChild
		("ThisElementHasText", -1);
	nodeElement->Text = "Inner text.";
	_di_IXMLNode nodeCData = document->CreateNode("any characters here",
		ntCData, "");
	document->DocumentElement->ChildNodes->Add(nodeCData);
	_di_IXMLNode nodeText = document->CreateNode("This is a text node.",
		ntText, "");
	document->DocumentElement->ChildNodes->Add(nodeText);

	document->SaveToFile(destPath);
}

void RetrieveDocument() {
	const _di_IXMLDocument document = interface_cast<Xmlintf::IXMLDocument>
		(new TXMLDocument(NULL));
	document->LoadFromFile(srcPath);

	// Find a specific node.
	const _di_IXMLNode nodeElement =
		document->ChildNodes->FindNode("ThisIsTheDocumentElement");

	if (nodeElement != NULL) {
		// Get a specific attribute.
		puts("Getting attribute...");
		const _TCHAR* attrName = _TEXT("attrName");
		if (nodeElement->HasAttribute(attrName)) {
			const _TCHAR* attrValue = nodeElement->Attributes[attrName];
			printf("Attribute value: %ls\n", attrValue);
		}

		// Traverse child nodes.
		puts("\nTraversing child nodes...");
		for (int i = 0; i < nodeElement->ChildNodes->Count; i++) {
			const _di_IXMLNode node = nodeElement->ChildNodes->Get(i);
			// Display node name.
			printf("Node name: %ls\n", node->NodeName);
			// Check whether the node type is Text.
			if (node->NodeType == ntText) {
				// Display node text.
				printf("\tThis is a node of type Text. The text is: %ls\n",
					node->Text);
			}
			// Check whether the node is a text element.
			if (node->IsTextElement) {
				printf("\tThis is a text element. The text is: %ls\n",
					node->Text);
			}
		}
	}
}

Uses