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
(MFC) XML Exclusive CanonicalizationDemonstrates how to convert XML to the Exclusive XML Canonicalization form as specified in http://www.w3.org/TR/xml-exc-c14n/
#include <CkHttp.h> #include <CkStringBuilder.h> #include <CkXmlDSig.h> void ChilkatSample(void) { CkString strOut; // 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. CkHttp http; CkStringBuilder sbXml; CkXmlDSig canon; // Use exclusive XML canonicalization. const char *canonVersion = "EXCL_C14N"; bool withComments = false; const char *div1 = "--------------- input ---------------"; const char *div2 = "--------------- canonicalized output ---------------"; bool success; CkStringBuilder sbUrl; int i = 1; while (i < 20) { sbUrl.SetString("https://www.chilkatsoft.com/exampleData/c14n/testTESTNUMBER.xml"); int numReplaced = sbUrl.ReplaceI("TESTNUMBER",i); success = http.QuickGetSb(sbUrl.getAsString(),sbXml); if (success == true) { const char *xmlCanon = canon.canonicalizeXml(sbXml.getAsString(),canonVersion,withComments); strOut.append("---- Test "); strOut.appendInt(i); strOut.append(" ----"); strOut.append("\r\n"); strOut.append(div1); strOut.append("\r\n"); strOut.append(sbXml.getAsString()); strOut.append("\r\n"); strOut.append(div2); strOut.append("\r\n"); strOut.append(xmlCanon); strOut.append("\r\n"); strOut.append(" "); strOut.append("\r\n"); } i = i + 1; } // 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> // // SetDlgItemText(IDC_EDIT1,strOut.getUnicode()); } |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.