Komprimované XML

Komprimované XML je velmi použitelný standard pro přenos tabulkových dat. Standard je navržen tak, aby co nejméně zatěžoval připojení k síti, tedy aby přenášená data byla co nejmenší.

XML dokument zapsaný v tomto formátu ztrácí svoji základní vlastnost - hierarchický datový model (1:N vazby). Může už pak vyjadřovat pouze množinu záznamů s určitým počtem atributů. To se výborně hodí zejména pro export jedné relace (tabulky) z relační databáze (MySQL).

Příklad:

klasický zápis s vazbami 1:N
<shop>
  <category name="damske">
    <product id="1" name="Zupan" price="300" />
    <product id="4" name="Sukne" price="450" />
    <product id="5" name="Halenka" price="200" />
  </category>
  <category name="panske">
    <product id="2" name="Triko" price="250" />
    <product id="3" name="Svetr" price="400" />
    <product id="7" name="Kalhoty" price="1100" />
    <product id="6" name="Rolak" price="320" />
  </category>
</shop>

zápis bez vazeb 1:N (bez hierarchického modelu)

<shop>
  <product id="1" name="Zupan" price="300" category="damske" />
  <product id="4" name="Sukne" price="450" category="damske" />
  <product id="5" name="Halenka" price="200" category="damske" />
  <product id="2" name="Triko" price="250" category="panske" />
  <product id="3" name="Svetr" price="400" category="panske" />
  <product id="7" name="Kalhoty" price="1100" category="panske" />
  <product id="6" name="Rolak" price="320" category="panske" />
</shop>

zápis pomocí komprimovaného XML

<root fields="name|price|category"> 
  <e xk="1" a="Zupan" b="300" c="damske" />
  <e xk="4" a="Sukne" b="450" c="damske" />
  <e xk="5" a="Halenka" b="200" c="damske" />
  <e xk="2" a="Triko" b="250" c="panske" /> 
  <e xk="3" a="Svetr" b="400" c="panske" /> 
  <e xk="7" a="Kalhoty" b="1100" c="panske" />
  <e xk="6" a="Rolak" b="320" c="panske" />
</root>

Srovnání

zápis počet znaků úspora
klasický 425 -
klasický bez 1:N 459 -8%
komprimovaný 351 17%

Komprimované XML nenajde využití pouze v B2B komunikacích, ale zejména v aplikacích s AJAXem, kde velikost přenášených dat hraje zásadní roli.

Bohužel nejsou k tomuto dni na internetu žádné podrobnější informace. Nenašel jsem dokonce ani specifikaci. Kdyby se někomu podařilo najít více, podělte se!

Hodnocení

Komentáře

[1] ~
2007-05-27 23:05:06

Toto XML _neni_ komprimovane, jsou v nem pouze zvoleny uspornejsi metody, cele je to v kvalite designu struktury a chce to trochu praxe, ale tam kde je potreba vykonna webova aplikace setrici prostredky sec to jde v zadnem pripade XML nema co delat, navic atributy pojmenovane jako a, b, c, ... zpusobuji horsi orientaci v textu a XML celkove dnes jeste stale neni "dobastlene", viz XSLT, XUL, xForms, xPath, xMath a nevim co jeste, nic z toho nefunguje spolehliveji nez klasicke desitky let programatory overene metody pro ukladani dat

[2] Dundee
2007-05-28 10:52:13

Není komprimované v tom smyslu, že není zabaleno do žádného archivu (tgz, zip, rar), ale jinak se tomuto standardu opravdu říká "komprimované" XML.

Těmi desítky let ověřenými metodami myslíš předpokládám EDI, že? Neřekl bych, že na psaní AJAXových aplikací je EDI zrovna vhodné. AJAX je přeci Asynchronous JavaScript and XML... Neříkám, že EDI není vhodné pro B2B komunikaci - tam se velmi osvědčilo - ale v tomhle případě je absolutně nepoužitelné. Pro výměnu faktur mezi firmami je príma, ale zkus si pomocí EDI napsat našeptávač...

[3] Messa
2007-06-03 16:52:41

Nic extra... To raději komprimaci implementovanou v JS.

2007-06-04 14:16:00

Kdyz je tak dulezite misto co takhle CSV nebo obycejny gzip?

[5] Dundee
2007-06-04 20:40:34

csv se treba dost spatne transformuje pres xsl...

Na tento komentář odpověděl [6] jachym
[6] jachym
2007-06-11 19:50:36

#5 Dundee: jakto? vzdyt neni nic snazsiho nez CSV skriptem pretransformovat na XML :)

<code>
'Name,Age','Michelle,17','Julie,24','Cathy,28' > d:\jachym\grlz.csv

$girlz = [xml]@"
<Girls>
$(
Import-Csv D:\jachym\grlz.csv |% {
' <Girl>'
" <Name>$($_.Name)</Name>"
" <Age>$($_.Age)</Age>"
' </Girl>'
}
)
</Girls>
"@</code>

Na tento komentář odpověděl [7] jachym
[7] jachym
2007-06-11 19:51:25

#6 jachym: este jednou:

'Name,Age','Michelle,17','Julie,24','Cathy,28' > d:\jachym\grlz.csv

$girlz = [xml]@"
<Girls>
$(
	Import-Csv D:\jachym\grlz.csv |% {
	'    <Girl>'
	"        <Name>$($_.Name)</Name>"
	"        <Age>$($_.Age)</Age>"
	'    </Girl>'
	}
)
</Girls>
"@

Komentáře již nelze přidávat