Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [XML] opis modulow za pomoca xml [mocno newbie]
Yacho
post
Post #1





Grupa: Zarejestrowani
Postów: 148
Pomógł: 0
Dołączył: 16.06.2003

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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]
Go to the top of the page
+Quote Post
hawk
post
Post #2





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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ć.
Go to the top of the page
+Quote Post
Yacho
post
Post #3





Grupa: Zarejestrowani
Postów: 148
Pomógł: 0
Dołączył: 16.06.2003

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
Dawid Pytel
post
Post #4





Grupa: Zarejestrowani
Postów: 133
Pomógł: 0
Dołączył: 15.09.2003

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 22:11