pátek 30. ledna 2009

Groovy XML past / Groovy XML trap

Vcelku oblíbený jazyk Groovy připravil svým uživatelům pěknou pastičku na kterou zdá se ještě moc lidí nepřišlo :-(. Tímto článkem se snažím předejít tomu aby se chytili další programátoři. Jelikož jsem k problému našel jen jednu další zmínku, zkusím tento článek psát dvojjazyčně.
Quite popular language Groovy has prepared nice trap to its users. This trap is not yet well known :-(. I would like to prevent more programmers to be trapped - that's why I'm posting this. Because I've found only one other remark about the problem, I will try my best to describe it multilingual.

Ona zákeřná past se skrývá v použití třídy XmlNodePrinter, která sice vypisuje XML pěkně, zato však porušuje pravidla XML specifikace. Totiž v XML jsou tzv. bílá místa v textových uzlech podstatná, ale XmlNodePrinter vám do každého textového uzlu přidá navíc spoustu mezer a dva nové řádky.
The greasy trap hides in use of XmlNodePrinter, which is printing pretty XML, but violates XML specification. The whitespaces are considered significant and meaningfull in text nodes. Unfortunately XmlNodePrinter adds two new lines and lot of spaces into each text node.

To cite Extensible Markup Language (XML) 1.0 (Fifth Edition):
"In editing XML documents, it is often convenient to use "white space"
(spaces, tabs, and blank lines) to set apart the markup for greater
readability. Such white space is typically not intended for inclusion in the delivered version of the document. On the other hand, "significant" white space that should be preserved in the delivered version is common, for example in poetry and source code."

S tímto nástrojem tedy nelze vytvořit např. takovéto XML:
<myname>Jiří Mikulášek</myname>
, při vypsání XmlNodePrinterem z toho máte
<myname>
Jiří Mikulášek
</myname>

Nemám pocit že bych se jmenoval "nový řádek""tabelátor"Jiří Mikulášek"nový řádek". Nejhorší na tom je, že jakmile začnete pracovat s XML pomocí XmlParseru jste v pasti, protože nemáte jinou možnost jak serializovat svoje XML korektně. Jedinou možností je celý kód přepsat například pomocí DOM.

So with such a tool is not possible to create XML like this:
<myname>Jiří Mikulášek</myname>
, because after printing with XmlNodePrinter it appears to be:
<myname>
Jiří Mikulášek
</myname>
I don't think that my name is "new line""tab"Jiří Mikulášek"new line". The worst thing on it is that once you have started to use XmlParser you are trapped, because there is no other possibility to serialize your XML correctly. The only possibility is to rewrite the whole code e. g. with DOM.

Další místo, kde se problém rozebírá je tato diskuze. Někdo z vývojářů Groovy tam slíbil, že se to snad časem vyřeší - tak doufejme.
Next place mentioning the problem is this discussion. Somebody from Groovy (I think) promised, that it will be solved in time - so we can hope.