Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Przejście z PHP4 na PHP5 - DOM XML

tzok 12 Mar 2009 17:55 1368 0
  • #1 12 Mar 2009 17:55
    tzok
    Moderator Samochody

    Modernizacja serwera elektroda.eu spowodowała problemy ze skryptami na mojej stronie. Nie mam teraz czasu od nowa pisać wszystkiego i chciałem na szybko dosztukować jakąś protezę. Znalazłem to:
    http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/index.en.html

    Ale próba użycia kończy się błędem:

    Cytat:
    Catchable fatal error: Argument 2 passed to DOMXPath::evaluate() must be an instance of DOMNode, null given, called in /home/tzok/domains/tzok.elektroda.eu/public_html/xmlQuery.php on line 26 and defined in /home/tzok/domains/tzok.elektroda.eu/public_html/domxml-php4-to-php5.php on line 462

    Błąd dotyczy funkcji:
    Code:
    function xpath_eval($eval_str,$contextnode=null)
    
       {
          if (method_exists($this->myDOMXPath,'evaluate')) $xp=isset($contextnode) ? $this->myDOMXPath->evaluate($eval_str,$contextnode->myDOMNode) : $this->myDOMXPath->evaluate($eval_str);
          else $xp=isset($contextnode) ? $this->myDOMXPath->query($eval_str,$contextnode->myDOMNode) : $this->myDOMXPath->query($eval_str);
          $xp=new php4DOMNodelist($xp,$this->myOwnerDocument);
          return ($xp->type===XPATH_UNDEFINED) ? false : $xp;
       }

    Dla jasności plik xmlQuery.php:
    Code:
    <?php
    
    include_once('domxml-php4-to-php5.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;
    }
    ?>

    Oraz przykład wywołania funkcji w nim zdefiniowanych:
    Code:
    <?
    
    include_once('xmlQuery.php5');

    $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);
      }
    }

    ...i sam plik xml (fragment):
    Code:
    <?xml version="1.0" encoding="utf-8" standalone="no"?>
    
    <!DOCTYPE mierniki SYSTEM "mult.dtd">
    <mierniki>
      <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>
      </producent>
    </mierniki>

    Może ktoś mógłby mi pomóc w rozwiązaniu mojego problemu?

    ***

    Jak się okazało w kodzie PHP4 są drobne błędy. Strona w zasadzie działa, za pomoc we wskazaniu błędów dziękuję Panu Alexandrowi Alapetite, autorowi skryptu DOMXML PHP4 to PHP5.

    Jest:
    Code:
    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;
    }
    Ma być:
    Code:
    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"), "value");
        return $xml_parsed;
    }

    0 0