Try OpenEdge Now
skip to main content
Working with XML
Reading and Writing XML Data from Temp-Tables and ProDataSets : Writing XML Schema from a temp-table, temp-table buffer, or ProDataSet : Writing a ProDataSet definition to XML Schema files
 

Writing a ProDataSet definition to XML Schema files

Temp-table members of a ProDataSet can have a NAMESPACE-URI attribute that differs from the NAMESPACE-URI of the ProDataSet. In this case, the WRITE-XMLSCHEMA( ) method uses a separate XML Schema document for the temp-table definition, since the XML Schema TargetNamespace attribute is different.
In other words, suppose your ProDataSet has three temp-table buffers. The ProDataSet defines a default namespace. The first temp-table buffer does not define a default namespace. Therefore, it uses the default namespace defined by its parent ProDataSet. The second temp-table buffer defines the same default namespace as the ProDataSet. So far, only a single XML Schema file is needed because only one namespace has been used. Suppose the third temp-table buffer defines a different default namespace. The method now needs to create a second XML Schema file for this temp-table buffer.
This code sample demonstrates the ability of the WRITE-XMLSCHEMA( ) method to write different XML Schema files for different namespaces. For example:
*The method writes one XML Schema file for the namespace associated with the ProDataSet definition.
*The method writes one XML Schema file for each temp-table with a different namespace.
The following is an abbreviated version of the include file that sets up the ProDataSet. Note the variety of namespaces used:
/* pi-tfx-writeSetup-2.i */
/* Define a ProDataSet and temp-table buffers that use multiple namespaces. */

DEFINE TEMP-TABLE ttDeptartment NO-UNDO
  NAMESPACE-URI "urn:Dept-Temp-Table" NAMESPACE-PREFIX "pfxDept"
  /* Field definitions. */

DEFINE TEMP-TABLE ttEmployee NO-UNDO
  NAMESPACE-URI "urn:Emp-Temp-Table" NAMESPACE-PREFIX "pfxEmp"
  /* Field definitions. */

DEFINE TEMP-TABLE ttFamily NO-UNDO
  NAMESPACE-URI "urn:Fam-Temp-Table" NAMESPACE-PREFIX "pfxFam"
  /* Field definitions. */

DEFINE DATASET dsEmployees
  NAMESPACE-URI "urn:PRODATASET" NAMESPACE-PREFIX "pfxDS"
  /* ProDataSet definition. */

/* Populate ProDataSet. */
The following is the main code (note that only a single target file name is specified):
/* pi-tfx-write-2.p */
/* Write ProDataSet definition to XML Schema files. */

{pi-tfx-parameterVarDefs.i}
{pi-tfx-writeSetup-2.i}

ASSIGN
  cTargetType = "FILE"
  cFile       = "prodataset.xsd"
  lFormatted  = YES
  cEncoding   = ?
  lMinSchema  = NO.

lReturn = DATASET dsEmployees:WRITE-XMLSCHEMA(cTargetType, cFile,
  lFormatted, cEncoding, lMinSchema).
This is the standard Open dialog box set up to show *.xsd files in the working directory:
The method call created four .xsd files and used the specified file name as the main ProDataSet-level XML Schema file. It also used the name as a root for naming other .xsd files it needed to create for temp-table buffers with different namespaces.
When reading this XML Schema, an application would find the child XML Schemas from the import directives in the in the main XML Schema. For example, here is a snippet of prodataset.xsd showing the imports:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:PRODATASET" xmlns:pfxDS="urn:PRODATASET"
   targetNamespace="urn:PRODATASET" elementFormDefault="qualified"
   xmlns:prodata="urn:schemas-progress-com:xml-prodata:0001"
   xmlns:pfxDept="urn:Dept-Temp-Table" xmlns:pfxEmp="urn:Emp-Temp-Table"
   xmlns:pfxFam="urn:Fam-Temp-Table">
<xsd:import namespace="urn:Dept-Temp-Table"
      schemaLocation="prodataset_ttDept.xsd"/>

<xsd:import namespace="urn:Emp-Temp-Table"
      schemaLocation="prodataset_ttEmp.xsd"/>

<xsd:import namespace="urn:Fam-Temp-Table"
      schemaLocation="prodataset_ttFam.xsd"/>

  . . .
</xsd:schema>
Note: This feature works exclusively when writing XML Schema documents to operating system files (target-type "FILE"), otherwise it returns an error.