Skip Headers

Oracle® Application Developer's Guide - XML 10g (9.0.4) Part Number B12099-01 |
Home | Contents | Index

# 28
Using XML C++ Class Generator

This chapter contains the following sections:

- Accessing XML C++ Class Generator

- Using XML C++ Class Generator

- XML C++ Class Generator Usage

- xmlcg Usage

- Using the XML C++ Class Generator Examples in sample/

## Accessing XML C++ Class Generator

The XML C++ Class Generator is provided with Oracle and is also available for download from the OTN site: http://otn.oracle.com/tech/xml

It is located in `$ORACLE_HOME/xdk/cpp/classgen`.

## Using XML C++ Class Generator

The XML C++ Class Generator creates source files from an XML DTD. The Class Generator takes the Document Type Definition (DTD) and generates classes for each defined element. Those classes are then used in a C++ program to construct XML documents conforming to the DTD.

This is useful when an application wants to send an XML message to another application based on an agreed-upon DTD or as the back end of a web form to construct an XML document. Using these classes, C++ applications can construct, validate, and print XML documents that comply with the input DTD.

The Class Generator works in conjunction with the Oracle XML Parser for C++, which parses the DTD and passes the parsed document to the class generator.

See Also: Chapter 3, "Oracle XML Developer Kits (XDKs) and Components: Overview and General FAQs", under "Using Oracle XML Components to Generate XML Documents: C++"

### External DTD Parsing

The XML C++ Class Generator can also parse an external DTD directly without requiring a complete (dummy) document. By using the Oracle XML Parser for C++ routine, `xmlparsedtd()`.

The provided command-line program `xmlcg` has a new '-d' option that is used to parse external DTDs. See "xmlcg Usage" .

### Error Message Files

Error message files are provided in the mesg/ subdirectory. The messages files also exist in the `$ORACLE_HOME/oracore/mesg` directory. You may set the environment variable `ORA_XML_MESG` to point to the absolute path of the `mesg/` subdirectory although this not required.

## XML C++ Class Generator Usage

Figure 28-1 summarizes the XML C++ Class Generator usage.

1. From the bin directory, at the command line, enter the following:

       xml [XML document file name, such as xxxxx]

   where XML document file name is the name of the parsed XML document or parsed DTD being processed. The XML document must have an associated DTD.

   The Input to the XML C++ Class Generator is an XML document containing a DTD, or an external DTD. The document body itself is ignored; only the DTD is relevant, though the document must conform to the DTD.

   Accepted character set encoding for input files are listed in Appendix F, "XDK for C++: Specifications and Cheat Sheet".

2. Two source files are output, a xxxxx.h header file and a xxxxx.cpp C++ file. These are named after the DTD file.

3. The output files are typically used to generate XML documents.

Constructors are provided for each class (element) that allow an object to be created in the following two ways:

- Initially empty, then adding the children or data after the initial creation

- Created with the initial full set of children or initial data

A method is provided for #PCDATA (and Mixed) elements to set the data and, when appropriate, set an element's attributes.

#### Figure 28-1 XML C++ Class Generator Functionality

Text description of the illustration adxml048.gif

## xmlcg Usage

The standalone parser may be called as an executable by invoking bin/xmlcg. For example:

    xmlcg [flags] <XML document or External DTD>

Table 28-1 lists the xmlcg optional flags.

##### Table 28-1 xmlcg Optional Flags

xmlcg Optional Flags | Description
--- | ---
-d name | DTD - Input is an external DTD with the given name
-o directory | Output directory for generated files (default is current directory)
-e encoding | Encoding - Default input file encoding
-h | Help - Show this usage help
-v | Version - Show the Class Generator version

## Using the XML C++ Class Generator Examples in sample/

Table 28-2 lists the files supplied the sample XML C++ Class Generator sample/ directory.

##### Table 28-2 XML C++ Class Generator Examples in sample/

Sample File Name | Description
--- | ---
CG.cpp | Sample program
CG.xml | XML file contains DTD and dummy document
CG.dtd | DTD file referenced by CG.xml
Make.bat on Windows NT Makefile on UNIX | Batch file (on Windows NT) or script file (on UNIX) to generate classes and build the sample programs.
README | A readme file with these instructions

The `make.bat` batch file (on Windows NT) or `Makefile` (on UNIX) do the following:

- Generate classes based on CG.xml into Sample.h and Sample.cpp

- Compile the program CG.cpp (using Sample.h), and link this with the Sample object into an executable named CG.exe in the...\bin (or .../bin) directory.

### XML C++ Class Generator Example 1: XML -- Input File to Class Generator, CG.xml

This XML file, CG.xml, inputs XML C++ Class Generator. It references the DTD file, CG.dtd.

    <?xml version="1.0"?>
    <!DOCTYPE Sample SYSTEM "CG.dtd">
      <Sample>
        <B>Be!</B>
        <D attr="value"></D>
        <E>
          <F>Formula1</F>
          <F>Formula2</F>
        </E>
      </Sample>

### XML C++ Class Generator Example 2: DTD -- Input File to Class Generator, CG.dtd

This DTD file, CG.dtd is referenced by the XML file CG.xml. CG.xml inputs XML C++ Class Generator.

    <!ELEMENT Sample (A | (B, (C | (D, E))) | F)>
    <!ELEMENT A (#PCDATA)>
    <!ELEMENT B (#PCDATA | F)*>
    <!ELEMENT C (#PCDATA)>
    <!ELEMENT D (#PCDATA)>
    <!ATTLIST D attr CDATA #REQUIRED>
    <!ELEMENT E (F, F)>
    <!ELEMENT F (#PCDATA)>

### XML C++ Class Generator Example 3: CG Sample Program

The CG sample program, `CG.cpp`, does the following:

1. Initializes the XML parser

2. Loads the DTD (by parsing the DTD-containing file-- the dummy document part is ignored)

3. Creates some objects using the generated classes

4. Invokes the validation function which verifies that the constructed classes match the DTD

5. Writes the constructed document to Sample.xml

    //////////////////////////////////////////////////////////////////////////////
    // NAME        CG.cpp
    // DESCRIPTION Demonstration program for C++ Class Generator usage
    //////////////////////////////////////////////////////////////////////////////

    #ifndef ORAXMLDOM_ORACLE
    # include <oraxmldom.h>
    #endif

    #include <fstream.h>

    #include "Sample.h"

    #define DTD_DOCUMENT	"CG.xml"
    #define OUT_DOCUMENT	"Sample.xml"

    int main()
    {
        XMLParser parser;
        Document *doc;
        Sample   *samp;
        B        *b;
        D        *d;
        E        *e;
        F        *f1, *f2;
        fstream  *out;
        ub4       flags = XML_FLAG_VALIDATE;
        uword     ecode;

        // Initialize XML parser
        cout << "Initializing XML parser...\n";
        if (ecode = parser.xmlinit())
        {
    cout << "Failed to initialize parser, code " << ecode << "\n";
            return 1;
        }

        // Parse the document containing a DTD; parsing just a DTD is not
        // possible yet, so the file must contain a valid document (which
        // is parsed but we're ignoring).
        cout << "Loading DTD from " << DTD_DOCUMENT << "...\n";
        if (ecode = parser.xmlparse((oratext *) DTD_DOCUMENT, (oratext *)0, flags))
        {
    cout << "Failed to parse DTD document " << DTD_DOCUMENT <<
        ", code " << ecode << "\n";
    return 2;
        }

        // Fetch dummy document
        cout << "Fetching dummy document...\n";
        doc = parser.getDocument();

        // Create the constituent parts of a Sample
        cout << "Creating components...\n";
        b = new B(doc, (String) "Be there or be square");
        d = new D(doc, (String) "Dit dah");
        d->setattr((String) "attribute value");
        f1 = new F(doc, (String) "Formula1");
        f2 = new F(doc, (String) "Formula2");
        e = new E(doc, f1, f2);

        // Create the Sample
        cout << "Creating top-level element...\n";
        samp = new Sample(doc, b, d, e);

        // Validate the construct
        cout << "Validating...\n";
        if (ecode = parser.validate(samp))
        {
    	cout << "Validation failed, code " << ecode << "\n";
    	return 3;
        }

        // Write out doc
        cout << "Writing document to " << OUT_DOCUMENT << "\n";
        if (!(out = new fstream(OUT_DOCUMENT, ios::out)))
        {
    	cout << "Failed to open output stream\n";
    	return 4;
        }
        samp->print(out, 0);
        out->close();

        // Everything's OK
        cout << "Success.\n";

        // Shut down
        parser.xmlterm();
        return 0;
    }

    // end of CG.cpp

| Copyright © 2001, 2003 Oracle Corporation. All Rights Reserved. |
Home | Contents | Index