Blog
SimpleXMLElement::addChild()
2009-11-19 23:53:54
Język PHP posiada kilka klas, "ułatwiających" przetwarzanie dokumentów XML. Jedną z takich klas jest klasa SimpleXMLElement. Wcale nie jest taka simple, ale jak się człowiek przyzwyczai to można z niej w miarę wygodnie korzystać. Oczywiście do póki nie będzie do wykonania coś bardziej skomplikowanego. Jednak rozkład na czynniki pierwsze czy synteza prostego pliku XML jest jak najbardziej wykonalna.
Jednakże klasa ta ma kilka wad. Ostatnio dała mi się we znaki metoda addChild() służąca do dodawania nowych węzłów. Jak wszyscy wiemy, pewne znaki w XML-u mają swoje specjalne znaczenie i nie mogą być użyte wprost. Te znaki to & i < (> już niekoniecznie). Jeśli nie chcemy, aby były interpretowane jako początek encji czy początek nowego znacznika należy je wyeskejpować czyli zapisać za pomocą encji (odpowiednio & i <). No właśnie... A metoda addChild() tego nie robi. A raczej robi, ale tylko połowicznie ;-)
Wpisując taki prosty kawałek kodu:
$xml->addChild('node', '<>abcd&efgh');
zostanie dodany element "node", jednak jego zawartość zostanie ograniczona do ciągu '<>abcd'. A na stdout poleci komunikat: Warning: SimpleXMLElement::addChild() [simplexmlelement.addchild]: unterminated entity reference efgh..
Jak bardzo niepożądane jest to zachowanie z punktu widzenia przekazywania informacji wszyscy wiemy. W komentarzach na php.net jest podanych kilka rozwiązań problemu, jednak te eleganckie nie działają, a działają te, które w zasadzie sprowadzają się do selektywnego eskejpowania samego ampersanda ;-)
No nic... Człowiek się przyzwyczaił eskejpować dane wprowadzane do bazy danych $this->_db->escape_string() to przyzwyczai się używać $this->_escapeAmpersandBecauseAddChildDoesNot() ;-)
Tagi: XML PHP programowanie
Komentarze
Nikt jeszcze nie skomentował tej notki.
Dodaj komentarz
