XML Canonical Forms
DRAFT 1
As with many sorts of structured information, there are many categories of information that may be deemed "important" for some task. Canonical forms are standard ways to represent such classes of information. For testing XML, and potentially for other purposes, three XML Canonical Forms have been defined as of this writing:
- First XML Canonical Form, defined by James Clark, is also called Canonical XML.
- Second XML Canonical Form, defined by Sun, supports testing a larger subset of the XML 1.0 processor requirements by exposing notation declarations.
- Third XML Canonical Form, defined by Sun, extends the second form to reflect information which validating XML 1.0 processors are required to report.
For a document already in a given canonical form, recanonicalizing to that same form will change nothing. Canonicalizing second or third forms to the first canonical form discards all declarations. Canonicalizing second or third forms to the other form has no effect.
The author is pleased to acknowledge help from
James Clark in defining the additional canonical forms.
First XML Canonical Form
This description has been extracted from the version at http://www.jclark.com/xml/canonxml.html.
Every well-formed XML document has a unique structurally equivalent canonical XML document. Two structurally equivalent XML documents have a byte-for-byte identical canonical XML document. Canonicalizing an XML document requires only information that an XML processor is required to make available to an application.
A canonical XML document conforms to the following grammar:
CanonXML ::= Pi* element Pi* element ::= Stag (Datachar | Pi | element)* Etag Stag ::= '<' Name Atts '>' Etag ::= '</' Name '>' Pi ::= '<?' Name ' ' (((Char - S) Char*)? - (Char* '?>' Char*)) '?>' Atts ::= (' ' Name '=' '"' Datachar* '"')* Datachar ::= '&' | '<' | '>' | '"' | '	'| ' '| ' ' | (Char - ('&' | '<' | '>' | '"' | #x9 | #xA | #xD)) Name ::= (see XML spec) Char ::= (see XML spec) S ::= (see XML spec)
Attributes are in lexicographical order (in Unicode bit order).
A canonical XML document is encoded in UTF-8.
Ignorable white space is considered significant and is treated equivalently
to data.
Second XML Canonical Form
Modified to ensure that literals are surrounded by single quotes.
This canonical form is identical to the first form, with one significant addition. All XML processors are required to report the name and external identifiers of notations that are declared and referred to in an XML document (section 4.7); those reports are reflected in declarations in this form, presented in lexicographic order.
Note that all public identifiers must be normalized before being presented to applications (section 4.2.2).
System identifiers are normalized on output to be relative to the input document, if that is possible, with the shortest such relative URI. All other URIs must be absolute. Any hash mark and fragment ID, if erroneously present on input, are removed. Any non-ASCII characters in the URI must be escaped as specified in the XML specification (section 4.2.2).
CanonXML2 ::= DTD2? CanonXML DTD2 ::= '<!DOCTYPE ' name ' [' #xA Notations? ']>' #xA Notations ::= ( '<!NOTATION ' Name ' (('PUBLIC ' PubidLiteral ' ' SystemLiteral) |('PUBLIC ' PubidLiteral) |('SYSTEM ' SystemLiteral)) '>' #xA )* PubidLiteral ::= "'" PubidChar* "'" SystemLiteral ::= "'" [^']* "'"
The requirement of this canonical form differs slightly from that
of the XML specification itself in that all declared notations
must be listed, not just those which were referred to.
Should that change? SAX supports it easily.
Third XML Canonical Form
This canonical form is identical to the second form, with two significant exceptions reflecting requirements placed on validating XML processors:
- They are required to report "white space appearing in element content" (section 2.10). Ignorable whitespace is not represented in this canonical form.
- They must report the external identifiers and notation name for unparsed entities appearing as attribute values (section 4.4.6). Such entities are declared in this canonical form, in lexicographic order.
This builds on the grammar productions included above.
CanonXML3 ::= DTD3? CanonXML DTD3 ::= '<!DOCTYPE ' name ' [' #xA Notations? Unparsed? ']>' #xA Unparsed ::= ( '<!ENTITY ' Name ' (('PUBLIC ' PubidLiteral ' ' SystemLiteral) |('SYSTEM ' SystemLiteral)) 'NDATA ' Name '>' #xA )*
The requirement of this canonical form differs slightly from that of the XML specification itself in that all declared unparsed entities must be listed, not just those which were referred to. Should that change? SAX supports it easily.
xml-feedback@java.sun.com