home *** CD-ROM | disk | FTP | other *** search
- <!-- ************************************************************************
- WDDX DTD:
-
- Author: Simeon Simeonov (simeons@allaire.com)
-
- Last modified: 9/25/1998
-
- Copyright (c) 1998 Allaire Corp. http://www.allaire.com
- -->
-
- <!-- ************************************************************************
- Introductory Notes:
-
-
- What is WDDX:
-
- WDDX stands for Web Distributed Data eXchange. WDDX is a mechanism for
- exchanging complex data structures between application environments. It
- has been designed with web applications in mind. WDDX consists of a
- language and platform neutral representation of instantiated data based
- on XML 1.0 (which is defined using this DTD) and a set of serializer/
- deserializer components for every environment that uses WDDX. The
- process of creating an XML representation of application data is called
- serialization. The process of instantiating application data from a
- WDDX XML representation is called deserialization.
-
- The WDDX DTD:
-
- The WDDX DTD can be used to validate WDDX packets. Packets are
- representations of instantiated data structures in application
- environments. The following is an example of a WDDX packet:
-
- <?xml version='1.0'?>
- <!DOCTYPE wddxPacket SYSTEM 'wddx_0090.dtd'>
- <wddxPacket version='0.9'>
- <header/>
- <data>
- <struct>
- <var name='s'>
- <string>a string</string>
- </var>
- <var name='n'>
- <number>-12.456</number>
- </var>
- <var name='d'>
- <dateTime>1998-06-12T04:32:12</dateTime>
- </var>
- <var name='b'>
- <boolean value='true'/>
- </var>
- <var name='a'>
- <array length='2'>
- <number>10</number>
- <string>second element</string>
- </array>
- </var>
- <var name='obj'>
- <struct>
- <var name='s'>
- <string>a string</string>
- </var>
- <var name='n'>
- <number>-12.456</number>
- </var>
- </struct>
- </var>
- <var name='r'>
- <recordset rowCount='2' fieldNames='NAME,AGE'>
- <field name='NAME'>
- <string>John Doe</string>
- <string>Jane Doe</string>
- </field>
- <field name='AGE'>
- <number>34</number>
- <number>31</number>
- </field>
- </recordset>
- </var>
- </struct>
- </data>
- </wddxPacket>
-
- It defines a root level object that is a structure (also known as
- an associative array) of six properties:
-
- - s which is the string 'a string',
- - n which is the number -12.456,
- - d which is the date-time value June 12, 1998 4:32:12am,
- - b which is the boolean value true,
- - a which is an array of two elements (10 and 'second element'),
- - obj which is a structure with two properties s and n, and
- - r which is a recordset of two rows with fields NAME and AGE.
-
- Basic data types:
-
- WDDX supports the following basic data types: boolean (true/false),
- number, date-time, and string.
-
- Numbers-
- Numbers are internally represented with floating point numbers. Because
- of differences between WDDX-enabled languages, the range of numbers has
- been restricted to +/-1.7E+/-308. The precision has been restricted to
- 15 digits after the decimal point. These requirements are consistent
- with an 8-byte floating point representation.
-
- Date-time values-
- Date-time values are encoded according to the full form of ISO8601,
- e.g., 1998-9-15T09:05:32+4:0. Note that single-digit values for months,
- days, hours, minutes, or seconds do not need to be zero-prefixed.
- While timezone information is optional, it must be successfully parsed
- and used to convert to local date-time values. Efforts should me made
- to ensure that the internal representation of date-time values does not
- suffer from Y2K problems and covers a sufficient range of dates. In
- particular, years must always be represented with four digits.
-
- Strings-
- Strings can be of arbitrary length and must not contain embedded nulls.
- To facilitate the inclusion of control characters in strings, the
- <string> element can contain <char code='??'/> elements. The value of
- the code attribute is a two-character representation of the UTF-8 hex
- code for a given control character. For example, <char code='0C'/>
- represents the form feed character. Control characters are characters
- in the UTF-8 range 00-1F. Note that tab (09) and newline (0A) characters
- can be included directly in XML text. The XML 1.0 specification Section
- 2.11 requires XML processors to not pass carriage return (0D) characters
- to applications.
-
- Note on end-of-line handling-
- End-of-line characters have platform and programming language specific
- representations. Different application environments may use either a
- single newline (0A), a single carriage return (0D), or a carriage return
- and newline combination (0D0A). For the purposes of successful data
- encoding and translation the elements <char code='0A'/> and
- <char code='0D'/> must be used to encode newline and carriage return
- characters when they should be preserved in the deserialized string.
- Note that Section 2.11 of the XML 1.0 specification requires XML
- processors to translate all occurences of carriage returns and the
- carriage return, newline combination to a single newline character.
- Therefore, for the purposes of XML, end-of-line is represented by a
- single newline character.
-
- Complex data types:
-
- WDDX supports the following complex data types: arrays, structures, and
- recordsets.
-
- Arrays-
- Arrays are integer-indexed collections of objects of arbitrary type.
- The starting index value is usually 0 with the notable exception of
- CFML whose arrays have an initial index value of 1. Because of these
- differences working with array indices can lead to non-portable data.
-
- Structures-
- Structures are string-indexed collections of object of arbitrary type.
- In many languages they are known as associative arrays. Structures
- contain one or more variables. Because some of the languages supported
- by WDDX are not case-sensitive, no two variable names can differ only
- by their case.
-
- Recordsets-
- Recordsets are tabular data encapsulations: a set of named fields with
- the same number of rows of data. Only simple data types can be stored in
- recordsets. For tabular data storage of complex data types, an array of
- structures should be used. Because some of the languages supported by
- WDDX are not case-sensitive, no two field names can differ only by
- their case.
-
- Data type comparisons:
-
- The following table compares the basic WDDX data types with those of
- languages/technologies commonly used on the Web.
-
- WDDX Type COM Java Type ECMAScript Type
- ************** ************* **************** ***************
- boolean boolean boolean boolean
- number float? float? number
- dateTime DATE ?? Date
- string BSTR java.lang.String string
- array VARIANT array ?? Array
- struct IWDDXStruct ?? Object
- recordset IWDDXRecordset ?? WddxRecordset
-
-
- More on data types:
-
- Null values-
- WDDX provides no notion of a null object. Null objects should be
- serialized to empty strings. Upon deserialization it is up to the
- component performing the operation to determine whether and where
- should empty strings be deserialized to null values. Null support
- is one area where future extensions are likely.
-
- Serialization model-
- WDDX serializes data using a model of pure aggregation. It has no
- mechanism for handling object references. Aliased references will
- result in multiple object instances being deserialized. WDDX
- serialization applied to a data structure that has cyclical references
- will most likely result in infinite iteration/recursion, depending on
- the serializer implementation. Object references support is another
- area of potential future investigation.
-
- DTD verbosity:
-
- This DTD is purposefully made verbose to aid the readability of WDDX
- packets. If packet size becomes an issue, compressing WDDX packets
- using an HTTP-safe real time compression algorithm is likely to be a
- much more appropriate solution than, for example, a DTD that uses one
- character element and attribute names. Some experiments conducted at
- Allaire suggest that 5 - 15 fold compression rates are achievable.
-
- -->
-
- <!ELEMENT wddxPacket (header, data)>
- <!ATTLIST wddxPacket
- version CDATA #FIXED "0.9">
-
- <!ELEMENT header (comment?)>
-
- <!ELEMENT comment (#PCDATA)>
-
- <!ELEMENT data (boolean | number | dateTime | string | array | struct | recordset)*>
-
- <!ELEMENT boolean EMPTY>
- <!ATTLIST boolean
- value (true | false) #REQUIRED>
-
- <!ELEMENT string (#PCDATA | char)*>
-
- <!ELEMENT char EMPTY>
- <!ATTLIST char
- code CDATA #REQUIRED>
-
- <!ELEMENT number (#PCDATA)>
-
- <!ELEMENT dateTime (#PCDATA)>
-
- <!ELEMENT array (boolean | number | dateTime | string | array | struct | recordset)*>
- <!ATTLIST array
- length CDATA #REQUIRED>
-
- <!ELEMENT struct (var*)>
-
- <!ELEMENT var (boolean | number | dateTime | string | array | struct | recordset)>
- <!ATTLIST var
- name CDATA #REQUIRED>
-
- <!ELEMENT recordset (field*)>
- <!ATTLIST recordset
- rowCount CDATA #REQUIRED
- fieldNames CDATA #REQUIRED>
-
- <!ELEMENT field (boolean | number | dateTime | string)*>
- <!ATTLIST field
- name CDATA #REQUIRED>
-