Nedávno jsem tady do nějaké diskuse napsal, že generování XML je někdy lepší si napsat sám, ručně, bez knihoven a hned se seběhli místní trollové, co že si to dovoluji si takovou věc psát sám… Přitom to generování XML je výrazně jednodušší než parsování (byť si nepíšeš vlastní parser asi zpracováváš SAX události nebo pracuješ nad DOMem nebo něco podobného). (jen dodávám, že cílem toho mého generátoru nebylo generování libovolného XML, ale určité podmnožiny, která je pro moje potřeby dostačující – důležité je, aby výstup bylo validní XML)
Kdysi jsem měl číst ceník v XML, který prodejce generoval tuším v Pohodě. V záhlaví sada Windows-1250, v obsahu francouzský parfém. Výsledkem nevalidní XML. Prodejce byl bohužel přesvědčen, že má vše správně. Lepení XML bohužel pokaždé nevyjde.
Obávám se, že když někdo neví, v jakém kódování má která data, tak ho nezachrání ani knihovna.
Viz např. v PHP:
<?php
$xw = xmlwriter_open_memory();
xmlwriter_set_indent($xw, 1);
$res = xmlwriter_set_indent_string($xw, "\t");
xmlwriter_start_document($xw, '1.0', 'UTF-8');
xmlwriter_start_element($xw, 'zkouška-kódování');
$text = "čeština v UTF-8";
xmlwriter_start_element($xw, 'správně');
xmlwriter_text($xw, $text);
xmlwriter_end_element($xw);
// tato data se načetla např. ze souboru nebo z databáze:
$text = "čeština v ISO-8859-2";
$text = iconv("UTF-8", "ISO-8859-2", $text);
xmlwriter_start_element($xw, 'špatně');
xmlwriter_text($xw, $text);
xmlwriter_end_element($xw);
xmlwriter_end_element($xw);
echo xmlwriter_output_memory($xw);
?>
Nebo v Javě:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class BadEncodingXml {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document d = db.newDocument();
Element root = d.createElement("zkouška-kódování");
d.appendChild(root);
{
String text = "čeština v UTF-8";
Element správně = d.createElement("správně");
správně.appendChild(d.createTextNode(text));
root.appendChild(správně);
}
{
String text = "čeština v ISO-8859-2";
text = new String(text.getBytes("ISO-8859-2"), "UTF-8");
// Java tam aspoň dá: � takže XML je validní, byť data jsou chybná
Element špatně = d.createElement("špatně");
// případně: text = "\0";
špatně.appendChild(d.createTextNode(text));
root.appendChild(špatně);
}
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.transform(new DOMSource(d), new StreamResult(System.out));
}
}
Chyba se dá udělat i při násobení dvou čísel, ale asi to neznamená, že přestaneme násobit, že?
Tady taky narážíme na to, že vývoj softwaru není jen o technologiích, ale i o lidském chování. Pro spolupráci je kolikrát důležitější než nedělat chyby, nebýt kretén a uznat, že v programu chyba je a opravit ji.