Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML] opis modulow za pomoca xml [mocno newbie]
Forum PHP.pl > Forum > XML, AJAX > XML
Yacho
no wiec tak:
planuje zbudowac CMSik i slyszalem ze do budowy modulow fajnbie i optymalnie jest wykorzystac XML - jako ze o XML pojecia nie mam wygoglalem kurs i zaczalem czytac - ogolnie XML wyglada mi na takki html w ktorym mozna wlasne znaczniki definowac (wiem ze to nieporecyzyjne okreslenie ale tak mi wyglada to snitch.gif )

no wiec zalozmy ze mam kod :

[xml:1:612d83a95b]
<modul>
<name>
Jakismodul
</name>
<header>
header modulu
</header>
<main>
glowna czesc modulu
</main>
</modul>
[/xml:1:612d83a95b]

taki sposob organizacji danytch mi sie podoba - fajnie bo moge sobie tagi dostosowac do swoich potrzeb...

Tylko teraz pytanie - jak "wyciagnac" te dane za pomoca php z xmla ?
przeciez nie bede otwieral pliku jako textowego i wyciagal linijka po linijce - nie kumam zbyt jak w ten sposob zapysane dane mozna wykorzystac "wklejajac" w odpowiednie miejsca...
moglby ktos objasnic ?
[/xml]
hawk
Wyciągasz generalnie stosując parser XML.

Do wyboru masz 2 metodologie: SAX i DOM. SAX przetwarza plik XML w oparciu o zdarzenia (np. "znalazłem taga <modul>", znalazłem koniec taga </modul>" itd). DOM natomiast tworzy w pamięci całą strukturę drzewiastą odpowiadającą plikowi XML.

W skrócie: używaj modelu SAX gdy chcesz tylko odczytać plik, DOM gdy zamierzasz go zmieniać z poziomu skryptu.

Biblioteki (parsery) SAX i DOM są dostępne w php. Szukaj w manualu pod hasłem XML smile.gif . Z tego co wiem, SAX jest bardziej dostępny. Oba parsery są jako rozszerzenia, ale gdzieś czytałem że php na Apache zawsze ma włączony SAX, a DOM niekoniecznie. Ale głowy za to nie dam sad.gif .

Jeszcze są dostępne parsery XML napisane w całośći w php, bez żadnych bibliotek. Np. ezXML (parser DOM), PEAR XML_HtmlSAX.

I na koniec: parsowanie XML jest wolne. Robienie tego za każdym wywołaniem boli. Dlatego lepiej sparsować sobie plik i wygenerować plik z jakimś odpowiadającym mu kodem, czyli "skompilować". I potem korzystać z tego, dopóki nie zmienisz XML - wtedy znowu automatycznie kompilować.
Yacho
no dobra... kwestia 1 rzeczy - jak bedzie wygladac przeparsowany xml ? on bedzie wciagniety w zmienne czy jak ? z czym to gryzc gdzie szukac przykladow zastosowan xml+php ?
Dawid Pytel
Witam

To ja może podam bardzo unwersalny kod php który pobiera dane z XMLa. Można go użyć chyba do każdego dokumentu XMLa (ja nim pobieram waluty z NBP).

[php:1:8a3b245a23]<?php
function fetch_xml($xml){

if(!($fp = fopen($xml, "r"))){
die("IO Error $xml_file");
}
while($chunk = fread($fp,4096)){
$xml_data .= $chunk;
}

$parser = xml_parser_create();
xml_parse_into_struct($parser, $xml_data, &$assoc_arr, &$idx_arr);
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);

$root_tag = $assoc_arr[$root_level]['tag'];
$base_level = $root_level+1;
$base_tag = strtolower($assoc_arr[$base_level]['tag']);
$i = 0;
$prefix = "";


foreach($assoc_arr as $element){
if($element['tag'] != $root_tag){
if(!preg_match('/^s+$/', $element['value'])){
$tag = strtolower($element['tag']);
if($element['type'] == 'open' && $element['level'] > ($base_level+1)){
// Add Prefix's for new Tags Under Base
$tag_prefix[$element['level']] = $tag;
} elseif($element['type'] == 'close' && $element['level'] > ($base_level+1)){
// Remove Prefix's when tags closed
$tag_prefix[$element['level']] = "";
} elseif($element['type'] == 'complete') {
// Generate Prefix
if(count($tag_prefix) > 0){
$str_prefix = "";
foreach($tag_prefix as $prefix){
if(!empty($prefix))
$str_prefix .= $prefix."_";
}
} // End Prefix
// Add Our Data to the Items Array
$extra = "";
while(isset($items[$i][$str_prefix.$tag.$extra])){
if(empty($extra))
$extra = 1;
$extra++;
}
$items[$i][$str_prefix.$tag.$extra] = $element['value'];
}
}
if($tag == $base_tag){
// Add Our Atttributes
if(isset($element['attributes']) && $element['type'] == 'open'){
$items[$i] = $element['attributes'];
}
// Start New Record
if($element['type'] == 'close'){
$i++;
}
}
}
}

return $items;
}
?>[/php:1:8a3b245a23]

Teraz wystarczy, że wywołasz funkcję w parametrze podając link do pliku xml. Funkcja zwróci Ci tablicę $items. Możesz zobaczyć na jakiej zasadzie jest zbudowana:

[php:1:8a3b245a23]<?php
echo "<pre>";
print_r($items);
echo "</pre>";
?>[/php:1:8a3b245a23]

To jest jeden z przykładów pobierania danych z xmla. Oczywiście większość programistów pisze specjalne parsery pobierające dane tylko z konkretnego pliku xml. Jednak to na początek pwoinno wystarczyć.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.