Classic ASP
Classic ASP
XML Exclusive Canonicalization
See more XML Digital Signatures Examples
Demonstrates how to convert XML to the Exclusive XML Canonicalization form as specified in http://www.w3.org/TR/xml-exc-c14n/Chilkat Classic ASP Downloads
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<%
success = 0
' This example requires the Chilkat API to have been previously unlocked.
' See Global Unlock Sample for sample code.
' The XML digital signature verification class provides utility methods for
' XML canonicalization. This example demonstrates how to do exclusive XML canonicalization.
' This example will show many sample XML inputs and outputs. The input XML files are available online
' as shown in this example.
set http = Server.CreateObject("Chilkat.Http")
set sbXml = Server.CreateObject("Chilkat.StringBuilder")
set canon = Server.CreateObject("Chilkat.XmlDSig")
' Use exclusive XML canonicalization.
canonVersion = "EXCL_C14N"
withComments = 0
div1 = "--------------- input ---------------"
div2 = "--------------- canonicalized output ---------------"
set sbUrl = Server.CreateObject("Chilkat.StringBuilder")
i = 1
Do While i < 20
success = sbUrl.SetString("https://www.chilkatsoft.com/exampleData/c14n/testTESTNUMBER.xml")
numReplaced = sbUrl.ReplaceI("TESTNUMBER",i)
success = http.QuickGetSb(sbUrl.GetAsString(),sbXml)
If (success = 1) Then
xmlCanon = canon.CanonicalizeXml(sbXml.GetAsString(),canonVersion,withComments)
Response.Write "<pre>" & Server.HTMLEncode( "---- Test " & i & " ----") & "</pre>"
Response.Write "<pre>" & Server.HTMLEncode( div1) & "</pre>"
Response.Write "<pre>" & Server.HTMLEncode( sbXml.GetAsString()) & "</pre>"
Response.Write "<pre>" & Server.HTMLEncode( div2) & "</pre>"
Response.Write "<pre>" & Server.HTMLEncode( xmlCanon) & "</pre>"
Response.Write "<pre>" & Server.HTMLEncode( " ") & "</pre>"
End If
i = i + 1
Loop
' The output of this program is:
'
' ---- Test 1 ----
' --------------- input ---------------
' <?xml version="1.0"?>
'
' <?xml-stylesheet href="doc.xsl"
' type="text/xsl" ?>
'
' <!DOCTYPE doc SYSTEM "doc.dtd">
'
' <doc>Hello, world!<!-- Comment 1 --></doc>
'
' <?pi-without-data ?>
'
' <!-- Comment 2 -->
'
' <!-- Comment 3 -->
' --------------- canonicalized output ---------------
' <?xml-stylesheet href="doc.xsl"
' type="text/xsl" ?>
' <doc>Hello, world!</doc>
' <?pi-without-data?>
'
' ---- Test 2 ----
' --------------- input ---------------
' <?xml version="1.0"?>
'
' <?xml-stylesheet href="doc.xsl"
' type="text/xsl" ?>
'
' <doc>Hello, world!<fish name="goldie" type = "goldfish" color='gold' /></doc>
'
' <?pi-without-data ?>
'
'
' --------------- canonicalized output ---------------
' <?xml-stylesheet href="doc.xsl"
' type="text/xsl" ?>
' <doc>Hello, world!<fish color="gold" name="goldie" type="goldfish"></fish></doc>
' <?pi-without-data?>
'
' ---- Test 3 ----
' --------------- input ---------------
' <doc>
' <clean> </clean>
' <dirty> A B </dirty>
' <mixed>
' A
' <clean> </clean>
' B
' <dirty> A B </dirty>
' C
' </mixed>
' </doc>
' --------------- canonicalized output ---------------
' <doc>
' <clean> </clean>
' <dirty> A B </dirty>
' <mixed>
' A
' <clean> </clean>
' B
' <dirty> A B </dirty>
' C
' </mixed>
' </doc>
'
' ---- Test 4 ----
' --------------- input ---------------
' <!DOCTYPE doc [
' <!ATTLIST normId id ID #IMPLIED>
' <!ATTLIST normNames attr NMTOKENS #IMPLIED>
' ]>
' <doc>
' <text>First line
 Second line</text>
' <value>2</value>
' <compute><![CDATA[value>"0" && value<"10" ?"valid":"error"]]></compute>
' <compute expr='value>"0" && value<"10" ?"valid":"error"'>valid</compute>
' <norm attr=' '   
	 ' '/>
' <normNames attr=' A   
	 B '/>
' <normId id=' '   
	 ' '/>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
' <text>First line
' Second line</text>
' <value>2</value>
' <compute>value>"0" && value<"10" ?"valid":"error"</compute>
' <compute expr="value>"0" && value<"10" ?"valid":"error"">valid</compute>
' <norm attr=" ' 
	 ' "></norm>
' <normNames attr="A 
	 B"></normNames>
' <normId id="' 
	 '"></normId>
' </doc>
'
' ---- Test 5 ----
' --------------- input ---------------
' <doc>
' <lizard type="gecko & african" abc="& test "" />
' <snake type="poisonous rattler" />
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
' <lizard abc="& test "" type="gecko & african"></lizard>
' <snake type="poisonous rattler"></snake>
' </doc>
'
' ---- Test 6 ----
' --------------- input ---------------
' <doc>
' <!-- A namespace node N is ignored if the nearest ancestor element of the node's parent element that is in the node-set has a namespace node in the node-set with the same local name and value as N. -->
' <animal xmlns="" xmlns:aa="https://www.animal.com/">
' <reptile xmlns:cc="https://www.herpetology.com/" xmlns:bb="https://www.reptile.com/">
' <lizard type="african fat tailed" abc="xyz" xmlns:aa="https://www.animal.com/" />
' <snake type="poisonous rattler" xmlns:bb="https://www.reptile.com/" >
' <cobra bb:name="benny" />
' </snake>
' </reptile>
' </animal>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
'
' <animal>
' <reptile>
' <lizard abc="xyz" type="african fat tailed"></lizard>
' <snake type="poisonous rattler">
' <cobra xmlns:bb="https://www.reptile.com/" bb:name="benny"></cobra>
' </snake>
' </reptile>
' </animal>
' </doc>
'
' ---- Test 7 ----
' --------------- input ---------------
' <doc>
' <!-- A namespace node N is ignored if the nearest ancestor element of the node's parent element that is in the node-set has a namespace node in the node-set with the same local name and value as N. -->
' <animal xmlns:aa="https://www.animal.com/">
' <reptile xmlns:bb="https://www.reptile.com/">
' <lizard xmlns="" type="african fat tailed" abc="xyz" xmlns:aa="https://www.animal.com/" />
' <snake type="poisonous rattler" xmlns:bb="https://www.reptile.com/" >
' </snake>
' </reptile>
' </animal>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
'
' <animal>
' <reptile>
' <lizard abc="xyz" type="african fat tailed"></lizard>
' <snake type="poisonous rattler">
' </snake>
' </reptile>
' </animal>
' </doc>
'
' ---- Test 8 ----
' --------------- input ---------------
' <doc>
' <!-- generate a space followed by xmlns="" if and only if the following conditions are met:
'
' the element E that owns the axis is in the node-set
' The nearest ancestor element of E in the node-set has a default namespace node in the node-set (default namespace nodes always have non-empty values in XPath)
' -->
' <animal xmlns="https://www.animal.com/">
' <reptile xmlns:bb="https://www.reptile.com/">
' <lizard xmlns="" type="african fat tailed" abc="xyz" xmlns:bb="https://www.reptile222.com/" >
' <myPet xmlns:bb="https://www.reptile.com/">larry</myPet>
' </lizard>
' <snake type="poisonous rattler" xmlns:bb="https://www.reptile.com/" >
' </snake>
' </reptile>
' </animal>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
'
' <animal xmlns="https://www.animal.com/">
' <reptile>
' <lizard xmlns="" abc="xyz" type="african fat tailed">
' <myPet>larry</myPet>
' </lizard>
' <snake type="poisonous rattler">
' </snake>
' </reptile>
' </animal>
' </doc>
'
' ---- Test 9 ----
' --------------- input ---------------
' <!DOCTYPE doc [<!ATTLIST e9 attr CDATA "default">]>
' <doc>
' <e1 />
' <e2 ></e2>
' <e3 name = "elem3" id="elem3" />
' <e4 name="elem4" id="elem4" ></e4>
' <e5 a:attr="out" b:attr="sorted" attr2="all" attr="I'm"
' xmlns:b="http://www.ietf.org"
' xmlns:a="http://www.w3.org"
' xmlns="http://example.org"/>
' <e6 xmlns="" xmlns:a="http://www.w3.org">
' <e7 xmlns="http://www.ietf.org">
' <e8 xmlns="" xmlns:a="http://www.w3.org">
' <e9 xmlns="" xmlns:a="http://www.ietf.org"/>
' </e8>
' </e7>
' </e6>
' </doc>
' --------------- canonicalized output ---------------
' <doc>
' <e1></e1>
' <e2></e2>
' <e3 id="elem3" name="elem3"></e3>
' <e4 id="elem4" name="elem4"></e4>
' <e5 xmlns="http://example.org" xmlns:a="http://www.w3.org" xmlns:b="http://www.ietf.org" attr="I'm" attr2="all" b:attr="sorted" a:attr="out"></e5>
' <e6>
' <e7 xmlns="http://www.ietf.org">
' <e8 xmlns="">
' <e9 attr="default"></e9>
' </e8>
' </e7>
' </e6>
' </doc>
'
' ---- Test 10 ----
' --------------- input ---------------
' <?xml version="1.0" encoding="UTF-8"?>
'
' <!DOCTYPE note [
' <!ENTITY nbsp " ">
' <!ENTITY author "Donald Duck">
' <!ENTITY writer "Writer: &author;.">
' <!ENTITY copyright "Copyright: < > Chilkat.">
' <!ATTLIST OPTIONS
' FINISH (Metal|Polished|Matte) "Matte"
' ADAPTER (Included|Optional|NotApplicable) "Included"
' CASE (HardShell|Soft|NotApplicable) "HardShell">
'
' <!ATTLIST footer
' src CDATA #REQUIRED
' id ID #IMPLIED
' sort CDATA #FIXED "true"
' print (yes | no) "yes"
' >
' <!ENTITY myEntityA "Some Entity Value A">
' <!ENTITY myEntityB "Some Entity Value B">
' ]>
'
' <note>
' <OPTIONS/>
' <to>Tove   á & < > ' " " ' ></to>
' <from eTest="&   á < > > ' ' " ">Jani</from>
' <heading myEntityTest="&myEntityA;">Reminder</heading>
' <body>Don't forget me this weekend!</body>
' <footer>&writer; ©right;</footer>
' <footer print="no">&writer; ©right;</footer>
' <someCData><![CDATA[
' & < > ' "
' " ' & < >
' This is a test.
' ]]></someCData>
' <someText>
' & < > ' "
' " ' >
' This is a test.
' </someText>
' </note>
' --------------- canonicalized output ---------------
' <note>
' <OPTIONS ADAPTER="Included" CASE="HardShell" FINISH="Matte"></OPTIONS>
' <to>Tove � � & < > ' " " ' ></to>
' <from eTest="& � � < > > ' ' " ">Jani</from>
' <heading myEntityTest="Some Entity Value A">Reminder</heading>
' <body>Don't forget me this weekend!</body>
' <footer print="yes" sort="true">Writer: Donald Duck.�Copyright: < > Chilkat.</footer>
' <footer print="no" sort="true">Writer: Donald Duck.�Copyright: < > Chilkat.</footer>
' <someCData>
' &amp; &lt; &gt; &apos; &quot;
' " ' & < >
' This is a test.
' </someCData>
' <someText>
' & < > ' "
' " ' >
' This is a test.
' </someText>
' </note>
'
' ---- Test 11 ----
' --------------- input ---------------
' <?xml version="1.0" encoding="UTF-8"?>
'
' <!DOCTYPE note [
' <!ENTITY nbsp " ">
' <!ENTITY writer "Writer: Donald Duck.">
' <!ENTITY copyright "Copyright: < > Chilkat.">
' <!ATTLIST OPTIONS
' FINISH (Metal|Polished|Matte) "Matte"
' ADAPTER (Included|Optional|NotApplicable) "Included"
' CASE (HardShell|Soft|NotApplicable) "HardShell">
'
' <!ATTLIST footer
' src CDATA #REQUIRED
' id ID #IMPLIED
' sort CDATA #FIXED "true"
' print (yes | no) "yes"
' >
' <!ENTITY myEntityA "Some Entity Value A">
' <!ENTITY myEntityB "Some Entity Value B">
'
' <!ENTITY c SYSTEM "http://www.xmlwriter.net/copyright.xml">
' <!ENTITY c PUBLIC "-//W3C//TEXT copyright//EN"
' "http://www.w3.org/xmlspec/copyright.xml">
'
' <!ENTITY logo SYSTEM "http://www.xmlwriter.net/logo.gif" NDATA gif>
' <!ENTITY logo PUBLIC "-//W3C//GIF logo//EN" "http://www.w3.org/logo.gif" NDATA gif>
'
' ]>
'
' <note>
' <OPTIONS/>
' <to>Tove</to>
' <from>Jani</from>
' <heading myEntityTest="&myEntityA;">Reminder</heading>
' <body>Don't forget me this weekend!</body>
' <footer>&writer; ©right;</footer>
' </note>
' --------------- canonicalized output ---------------
' <note>
' <OPTIONS ADAPTER="Included" CASE="HardShell" FINISH="Matte"></OPTIONS>
' <to>Tove</to>
' <from>Jani</from>
' <heading myEntityTest="Some Entity Value A">Reminder</heading>
' <body>Don't forget me this weekend!</body>
' <footer print="yes" sort="true">Writer: Donald Duck.�Copyright: < > Chilkat.</footer>
' </note>
'
' ---- Test 12 ----
' --------------- input ---------------
' <?xml version="1.0" encoding="UTF-8"?>
' <lizard xml:space="retain" xml:lang="en">
' <gecko />
' <bearded_dragon xml:lang="en" xml:space="retain">pip</bearded_dragon>
' </lizard>
'
' --------------- canonicalized output ---------------
' <lizard xml:lang="en" xml:space="retain">
' <gecko></gecko>
' <bearded_dragon xml:lang="en" xml:space="retain">pip</bearded_dragon>
' </lizard>
'
' ---- Test 13 ----
' --------------- input ---------------
' <?xml version="1.0" encoding="UTF-8"?>
' <lizard xmlns="http://www.chilkatsoft.com">
' <gecko name="larry" />
' <bearded_dragon xmlns="http://www.beardies.com" name="pip">pip</bearded_dragon>
' </lizard>
'
' --------------- canonicalized output ---------------
' <lizard xmlns="http://www.chilkatsoft.com">
' <gecko name="larry"></gecko>
' <bearded_dragon xmlns="http://www.beardies.com" name="pip">pip</bearded_dragon>
' </lizard>
'
' ---- Test 14 ----
' --------------- input ---------------
' <doc>
' <a xmlns:aa="https://www.test1.org">
' <b xmlns:aa="https://www.test2.org">
' <c xmlns:aa="https://www.test1.org">
' <d xmlns:aa="https://www.test2.org">
' <e xmlns:aa="https://www.test1.org">
' </e>
' </d>
' </c>
' </b>
' </a>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
' <a>
' <b>
' <c>
' <d>
' <e>
' </e>
' </d>
' </c>
' </b>
' </a>
' </doc>
'
' ---- Test 15 ----
' --------------- input ---------------
' <doc>
' <a xmlns:aa="https://www.test1.org">
' <b xmlns:aa="https://www.test1.org">
' <c xmlns:aa="https://www.test1.org">
' <d xmlns:aa="https://www.test1.org">
' <e xmlns:aa="https://www.test1.org">
' </e>
' </d>
' </c>
' </b>
' </a>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
' <a>
' <b>
' <c>
' <d>
' <e>
' </e>
' </d>
' </c>
' </b>
' </a>
' </doc>
'
' ---- Test 16 ----
' --------------- input ---------------
' <doc>
' <a xmlns="">
' <b xmlns="">
' <c xmlns="https://www.chilkatsoft.com">
' <c2 xmlns="https://www.chilkatsoft.com">
' <d xmlns="">
' <e xmlns="">
' </e>
' </d>
' </c2>
' </c>
' </b>
' </a>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
' <a>
' <b>
' <c xmlns="https://www.chilkatsoft.com">
' <c2>
' <d xmlns="">
' <e>
' </e>
' </d>
' </c2>
' </c>
' </b>
' </a>
' </doc>
'
' ---- Test 17 ----
' --------------- input ---------------
' <doc>
' <a xmlns:aa="https://www.testA.com/" xmlns:zz="https://testZ.com" zz:color="blue" xmlns:yy="https://testY.com">
' <b xmlns="">
' <c xmlns:aa="https://www.testA.com/" aa:location="Chicago" xmlns:bb="https://www.testB.com/">
' <bb:d xmlns:aa="https://www.testAA.com/" aa:country="USA" yy:planet="Earth">
' </bb:d>
' </c>
' </b>
' </a>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
' <a xmlns:zz="https://testZ.com" zz:color="blue">
' <b>
' <c xmlns:aa="https://www.testA.com/" aa:location="Chicago">
' <bb:d xmlns:aa="https://www.testAA.com/" xmlns:bb="https://www.testB.com/" xmlns:yy="https://testY.com" yy:planet="Earth" aa:country="USA">
' </bb:d>
' </c>
' </b>
' </a>
' </doc>
'
' ---- Test 18 ----
' --------------- input ---------------
' <doc>
' <a xmlns:aa="https://www.testA.com/" aa:location="Chicago">
' <b xmlns:aa="https://www.testA.com/"><!-- aa is not emitted here (using exclusive canon) -->
' <c xmlns:aa="https://www.testA.com/">test</c><!-- aa is not emitted here (using exclusive canon) -->
' </b>
' </a>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
' <a xmlns:aa="https://www.testA.com/" aa:location="Chicago">
' <b>
' <c>test</c>
' </b>
' </a>
' </doc>
'
' ---- Test 19 ----
' --------------- input ---------------
' <doc>
' <!-- generate a space followed by xmlns="" if and only if the following conditions are met:
'
' the element E that owns the axis is in the node-set
' The nearest ancestor element of E in the node-set has a default namespace node in the node-set (default namespace nodes always have non-empty values in XPath)
' -->
' <animal xmlns:bb="https://www.reptile.com/">
' <bb:reptile xmlns="https://www.animal.com/" bb:abc="123">
' <lizard xmlns="" type="african fat tailed" abc="xyz" xmlns:bb="https://www.reptile222.com/" >
' <myPet xmlns:bb="https://www.reptile.com/">larry</myPet>
' </lizard>
' <snake type="poisonous rattler" xmlns:bb="https://www.reptile.com/" >
' </snake>
' </bb:reptile>
' </animal>
' </doc>
'
' --------------- canonicalized output ---------------
' <doc>
'
' <animal>
' <bb:reptile xmlns:bb="https://www.reptile.com/" bb:abc="123">
' <lizard abc="xyz" type="african fat tailed">
' <myPet>larry</myPet>
' </lizard>
' <snake xmlns="https://www.animal.com/" type="poisonous rattler">
' </snake>
' </bb:reptile>
' </animal>
' </doc>
'
'
%>
</body>
</html>