Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][XML]DOM_XML i PHP4 -> PHP5
Forum PHP.pl > Forum > Przedszkole
tzok
Witam, to mój pierwszy post na tym forum. Jeśli chodzi o PHP jestem raczej początkujący. Jakiś czas temu stworzyłem stronę, która działała i miała się dobrze, ale admin hostingu, bez ostrzeżenie uraczył mnie upgrade'm serwera, przy okazji którego przeszedł z PHP4 na PHP5. Niestety nie potrafię sobie poradzić z przerobieniem funkcji odpowiedzialnej za pobieranie danych z pliku XML.

Funkcja wyglądała tak (plik xmlQuery.php):
Kod
<?php
   function node_content($node,$attribute="content"){
       $result = array();
       if (count($node->nodeset)>0) {
           foreach($node->nodeset as $content){
               $result[] = $content->{$attribute};
           }
       }
       return $result;
   }
  
   function getCDATA($xml, $xpath){
       $dom = domxml_open_mem($xml);
       $calcX = $dom->xpath_new_context();
       $xml_parsed=node_content($calcX->xpath_eval("$xpath/text()"));
       return $xml_parsed;
   }
  
   function getAttributes($xml, $xpath, $att_name){
       $dom = domxml_open_mem($xml);
       $calcX = $dom->xpath_new_context();
       $xml_parsed=node_content($calcX->xpath_eval("$xpath/attribute::$att_name",$calcX), "value");
       return $xml_parsed;
   }
   ?>


Jej wywołanie i obsługa struktury, którą generauje, wygląda tak:
Kod
<?php
   include_once('xmlQuery.php');
  
   $file = "mult.xml";
   if (!($fp = fopen($file, "r"))) {
     die("could not open XML input");
   }
   $data = fread($fp, filesize($file));
   fclose($fp);
   $producenci = getAttributes($data, '//producent', 'nazwa');
   foreach ($producenci as $producent){
     $logo = getAttributes($data, "//producent[@nazwa='$producent']", 'logo');
     $tresc[$producent]['logo'] = $logo[0];
     $mierniki = getAttributes($data, "//producent[@nazwa='$producent']/miernik", 'typ');
     foreach ($mierniki as $typ){
         $nazwa = getCDATA($data, "//miernik[@typ='$typ']/nazwa");
         $tresc[$producent]['mierniki'][$typ]['nazwa'] = $nazwa[0];
         $zdjecie = getCDATA($data, "//miernik[@typ='$typ']/zdjecie");
         $tresc[$producent]['mierniki'][$typ]['zdjecie'] = (sizeof($zdjecie)>0?$zdjecie[0]:null);
     }
   }
  
   print '<TABLE width="870" border="1" cellpadding="0" cellspacing="0" align="center">'."\n";
   foreach ($tresc as $producent => $mierniki){
     $logo = $tresc[$producent]['logo'];
     print '<tr><td colspan="3" class="producent">'."\n";
     print "<img src=\"m_logo/$logo\" alt=\"$producent\">"."\n";
     print '</td></tr>'."\n";
     $col=0;
     foreach ($mierniki['mierniki'] as $typ => $miernik){
       $nazwa = $miernik['nazwa'];
       $zdjecie = $miernik['zdjecie'];
       if ($col==0){
         print '<tr>'."\n";
       }
       print '<TD class="miernik">'."\n";
       print "<a name=\"$typ\" href=\"multimetr.php?typ=$typ\">";
       if ($zdjecie != null){
         print "<img src=\"miniaturki/$zdjecie\" alt=\"$nazwa\" border=\"0\">
   ";
       }
       print "$nazwa</a></td>"."\n";
       $col++;
       if ($col==3) {
         $col=0;
         print '</tr>'."\n";
       }
     }
     if ($col!=0){
       while ($col<3){
         $col++;
         print '<TD class="miernik">&nbsp;</TD>'."\n";
       }
       print '</tr>'."\n";
     }
   }
   print '</table>'."\n";
   ?>


Plik XML ma taką definicję:
Kod
<!ELEMENT mierniki (producent+)>
   <!ELEMENT producent (miernik+)>
   <!ELEMENT miernik (nazwa, parametry+, zdjecie?, schematy*, instrukcja?)>
   <!ELEMENT nazwa (#PCDATA)>
   <!ELEMENT parametry (#PCDATA)>
   <!ELEMENT zdjecie (#PCDATA)>
   <!ELEMENT schematy (#PCDATA)>
   <!ELEMENT instrukcja (#PCDATA)>
   <!ATTLIST producent nazwa CDATA #REQUIRED logo CDATA #IMPLIED>
   <!ATTLIST miernik typ CDATA #REQUIRED>
   <!ATTLIST schematy opis CDATA "schemat">
   <!ATTLIST instrukcja opis CDATA "instrukcja">


...a to jego fragment:
Kod
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE mierniki SYSTEM "mult.dtd">
<mierniki>
   <producent nazwa="Energia" logo="energia_logo.gif">
     <miernik typ="MUR-4">
       <nazwa>MUR-4</nazwa>
       <parametry>DCV: 1 2,5 10 25 100 250 (20kOhm/V)</parametry>
       <parametry>ACV: 2,5 10 25 100 250 1000 (2kOhm/V)</parametry>
       <parametry>DCmA: 1 2,5 10 25 100 250 1000 2500</parametry>
       <parametry>200 kOhm: x0,1 x1 x10</parametry>
       <parametry>200 uF: x0,01</parametry>
       <zdjecie>MUR-4.jpg</zdjecie>
     </miernik>
   </producent>
   <producent nazwa="Lumel" logo="lumel_logo.gif">
     <miernik typ="LAVO-21">
       <nazwa>Miernik Uniwersalny LAVO-21</nazwa>
       <parametry>DCV: 0,15 0,5 1,5 5 15 50 150 500 (20kOhm/V)</parametry>
       <parametry>ACV: 0,5 1,5 5 15 50 150 500 (6,32kOhm/V)</parametry>
       <parametry>DCmA: 0,15 0,5 1,5 5 15 50 150 500</parametry>
       <parametry>ACmA: 0,5 1,5 5 15 50 150 500</parametry>
       <parametry>kOhm: 1, 100</parametry>
       <zdjecie>LAVO-21.jpg</zdjecie>
       <schematy opis="schemat">Lavo-21.gif</schematy>
       <instrukcja opis="instrukcja">Lavo-21.djvu</instrukcja>
     </miernik>
     <miernik typ="LAVO-3">
       <nazwa>Miernik Uniwersalny LAVO-3</nazwa>
       <parametry>DCV: 0,15 3 15 60 150 300 600 (20kOhm/V)</parametry>
       <parametry>ACV: 3 15 60 150 300 600 (5kOhm/V)</parametry>
       <parametry>DCmA: 0,05 1,5 6 30 150 600 1500</parametry>
       <parametry>ACmA: 0,2 1,5 6 30 150 600 1500</parametry>
       <parametry>50 kOhm: x0,1 x1 x10</parametry>
       <zdjecie>LAVO-3.jpg</zdjecie>
       <schematy opis="schemat">Lavo-3.gif</schematy>
       <instrukcja opis="instrukcja">Lavo-3.djvu</instrukcja>
     </miernik>
   </producent>
</mierniki>


Z góry dziękuję za pomoc w dostosowaniu skryptu xmlQuery.php do PHP5.
Pilsener
Zamiast DOM użyj funkcji XML:
http://pl.php.net/manual/pl/ref.simplexml.php

Cytat
Niestety nie potrafię sobie poradzić z przerobieniem funkcji odpowiedzialnej za pobieranie danych z pliku XML
- bo nie da się tego zrobić podmieniając dwa znaki. Trzeba to napisać od nowa lub poszukać innego skryptu, bazującego na funkcjach typu simple_xml_load_file.
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.