Chilkat HOME Android™ Classic ASP C C++ C# Mono C# .NET Core C# C# UWP/WinRT DataFlex Delphi ActiveX Delphi DLL Visual FoxPro Java Lianja MFC Objective-C Perl PHP ActiveX PHP Extension PowerBuilder PowerShell PureBasic CkPython Chilkat2-Python Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ Visual Basic 6.0 VB.NET VB.NET UWP/WinRT VBScript Xojo Plugin Node.js Excel Go
(Excel) XML Exclusive CanonicalizationDemonstrates how to convert XML to the Exclusive XML Canonicalization form as specified in http://www.w3.org/TR/xml-exc-c14n/
' 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. Dim http As Chilkat.Http Set http = Chilkat.NewHttp Dim sbXml As Chilkat.StringBuilder Set sbXml = Chilkat.NewStringBuilder Dim canon As Chilkat.XmlDSig Set canon = Chilkat.NewXmlDSig ' Use exclusive XML canonicalization. canonVersion = "EXCL_C14N" withComments = False div1 = "--------------- input ---------------" div2 = "--------------- canonicalized output ---------------" Dim sbUrl As Chilkat.StringBuilder Set sbUrl = Chilkat.NewStringBuilder i = 1 Do While i < 20 Dim success As Boolean success = sbUrl.SetString("https://www.chilkatsoft.com/exampleData/c14n/testTESTNUMBER.xml") numReplaced = sbUrl.ReplaceI("TESTNUMBER",i) success = http.QuickGetSb(sbUrl.GetAsString(),sbXml) If (success = True) Then xmlCanon = canon.CanonicalizeXml(sbXml.GetAsString(),canonVersion,withComments) Debug.Print "---- Test "; i; " ----" Debug.Print div1 Debug.Print sbXml.GetAsString() Debug.Print div2 Debug.Print xmlCanon Debug.Print " " 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> ' ' |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.