środa, 4 kwietnia 2007

Przetwarzanie XML w językach Java i PHP (cz.2)


W przypadku PHP dostępność standardów obsługi XMLa ewoluowała wraz z kolejnymi wersjami. Dla wersji 3 dostępny był interfejs SAX, który nie zmienił się do chwili obecnej (problemy kompatybilności mogą być związane jedynie z obsługą przestrzeni nazw dla elementów, jeżeli zainstalowana jest biblioteka libxml2 w wersji starszej niż 2.6).


W wersji 4 dodano obsługę DOM (rozszerzenie domxml) oraz XSLT (rozszerzenie xslt). Pierwsze z nich nie spełniało jednak założeń W3C, powodowało wiele wycieków pamięci, przez co nie było zbyt popularne. Drugie wymagało do działania biblioteki Sablotron lub Expat.


Prawdziwy przełom przyniosła wersja 5. Obsługa DOM została przepisana na nowo, zgodnie ze standardami W3C i umieszczona w rozszerzeniu DOM. Dodano obsługę XPath oraz walidację według plików DTD (odnośnik umieszczony w pliku XML), XSchema oraz RelaxNG (nazwa pliku definiowana w wywołaniu funkcji).
XSLT zostało oparte o bibliotekę libxslt (najszybsze rozwiązanie na rynku) i umieszczone w rozszerzeniu XSL.
Oba nabrały również prawdziwie obiektowego charakteru.
Co więcej dodano interfejs SimpleXML umożliwiający łatwą modyfikacje plików XML bez znacznego obciążenia systemu charakterystycznego dla DOM.


SAX


Parser SAX tworzymy poprzez wywołanie funkcji xml_parser_create(); Kolejnym etapem jest utworzenie funkcji odpowiadających zdarzeniom XML i ich zarejestrowanie. Pod adresem http://pl.php.net/manual/en/ref.xml.php#id7330424 dostępny jest przykład takiego parsera (łącznie ze sprawdzaniem zewnętrznych encji).


DOM i SimpleXML


W przypadku PHP 5 użycie DOM jest analogiczne jak w innych językach programowania (JavaScript, Java...). Pracę z nim rozpoczynamy od utworzenia obiektu DOMDocument.
SimpleXML jest natomiast bardzo ciekawym intefejsem. Na podstawie pliku XML tworzy on coś na kształt klasy PHP stdClass (dla innych języków obiektowych można porównać to do klasy będącej kolekcją obiektów). Dzięki czemu do danego elementu odwołujemy się w bardzo przyjemny sposób (Zend wykorzystał ten intefejs przy tworzeniu klasy Zend_Config_XML).
Warto zauważyć, że poprzez funkcję simplexml_import_dom i dom_import_simplexml możemy łatwo konwertować dane z jednego standardu na drugi (jest to szczególnie przydatne w przypadku zapisywania dokumentu XML do pliku, której to SimpleXML funkcji nie posiada).


Przykład


Na koniec chciałbym przedstawić przykład, który pobiera dane z tabeli Customers (baza Sample XML dla IBM DB2 9) i wyciąga z nich imię i nazwisko klienta. Pragnę zwrócić uwagę na dwa elementy. Po pierwsze różnice w objętości dla SimpleXML i DOM realizujących tą samą operację. Po drugie warto zauważyć, iż metody klas DOMDocument w PHP i Document dla Javy są takie same:

error_reporting(E_ALL|E_STRICT);

$user = "db2admin";
$password = "***";
$database = "SAMPLE";
$hostname = "localhost";
$port = 50000;

$connect_string = "DRIVER={IBM DB2 ODBC DRIVER};" .
"DATABASE=$database;" .
"HOSTNAME=$hostname;" .
"PORT=$port;" .
"PROTOCOL=TCPIP;" .
"UID=$user;" .
"PWD=$password;";
$connection = db2_connect($connect_string,'','');
if ($connection){
echo "Connection successful.<br />";
$sql = "SELECT INFO FROM CUSTOMER WHERE CID = ?";
$statement = db2_prepare($connection, $sql);
db2_execute($statement,array(1001));

while ($customer = db2_fetch_object($statement)){
$info = $customer->INFO;

//SimpleXML
$simpleXML = new SimpleXMLElement($info);
echo $simpleXML->name."<br />";

//DOM
$domDocument = new DOMDocument('1.0','UTF-8');
$domDocument->loadXML($info);
$names = $domDocument->getElementsByTagName('name');
foreach ($names as $name) {
echo $name->nodeValue.'<br />';
}
}
db2_close($connection);
}else{
echo "Connection failed.";
}



Podsumowanie


Pokazane w obu częściach przykłady stanowią jedynie czubek góry lodowej związanej z przetwarzaniem dokumentów XML w językach Java i PHP. Jednak mogę okazać się przydatnym wstępem do dalszego zgłębiania tematu.

Wszelakie komentarze i uwagi mile widziane

1 komentarz:

Józef Maślorz pisze...

Jakiś czas temu napisałem skrypt, który korzysta z xml flicka i przerabia je, tworząc ładną galerie. Są tam wykorzystane te same funkcje co tutaj, tylko może inaczej zdefiniowane.
http://ewebdesign.pl/przetwarzanie-plikow-xml-za-pomoca-php/