freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

XML to object για PHP 4


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » PHP Προγραμματισμός και εφαρμογές » PHP τα δικά μας scripts
Moderators:  PHP Moderators, Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [4 Μηνύματα]      Bookmarks Tags: phpxml Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
cpulse
Script Master

Μέλος από: 21 Μαρ 2006
Βοηθήματα: 8
Νέα: 1
Scripts: 3
Μηνύματα: 256+

Περιοχή: Αθήνα village
View users profile Visit posters website
ΜήνυμαΣτις: 19 Φεβ 2007 17:18    Θέμα: XML to object για PHP 4 Απάντηση με παράθεση  Mark this post and the followings unread

Προβλήματα με XML; Η γυναίκα σας φωνάζει οτι την παραμελείτε; Δεν έχετε χρόνο να δείτε μπάλα επειδή σκαλώσατε σε ένα τόσο δα μικρό πρόβλημα; Μπήκατε φυλακή απο χρέη επειδή χαλάσατε παραπάνω χρόνο σε XML parsers;

Με ούλτρεξ λουστήκατε;

Μια ωραία λύση για xml2object για PHP 4. Η PHP 5 έτσι κι αλλιώς έχει το SimpleXML.

κώδικας:

class XMLNode {
   var $nodes, $attrs, $nodeName, $nodeValue;
   
   function XMLNode($nodeName = false, $attrs = false) {
      $this->nodes = array();
      $this->attrs = $attrs !== false ? $attrs : array();
      $this->nodeName = $nodeName !== false ? $nodeName : '';
      $this->nodeValue = false;
   }
   
   function &node_create($name, $attrs) {
      $this->nodes[] = new XMLNode($name, $attrs);
      return $this->nodes[count($this->nodes) - 1];
   }

   function value_append($str) {
      if ($this->nodeValue === false) $this->nodeValue = '';
      $this->nodeValue .= $str;
   }
   
   function &n($nodeName, $die_on_notfound = true) {
      $nodeName = strtoupper($nodeName);
      foreach ($this->nodes as $k => $v) if ($v->nodeName == $nodeName) return $this->nodes[$k];
      
      if ($die_on_notfound) die("XMLNode error: Node '{$this->nodeName}' does not contain any '$nodeName' nodes.");
      else return false;
   }
}

function XML_parse_start($parser, $name, $attrs) {
   global $doc_bc;
   $doc_bc[] = &$doc_bc[count($doc_bc) - 1]->node_create($name, $attrs);
}

function XML_parse_end($parser, $name) {
   global $doc_bc;
   array_pop($doc_bc);
}

function XML_parse_data($parser, $data) {
   global $doc_bc;
   $doc_bc[count($doc_bc) - 1]->value_append($data);
}

function XML_load_from_text($data) {
   $xml_parser = xml_parser_create();
   xml_set_element_handler($xml_parser, 'XML_parse_start', 'XML_parse_end');
   xml_set_character_data_handler($xml_parser, 'XML_parse_data');

   $doc = new XMLNode();
   $GLOBALS['doc_bc'] = array(&$doc);

   if (!xml_parse($xml_parser, $data, true)) die( sprintf(
      "XML error: %s at line %d",
      xml_error_string(xml_get_error_code($xml_parser)),
      xml_get_current_line_number($xml_parser)
      ) );

   xml_parser_free($xml_parser);
   unset($GLOBALS['doc_bc']);
   
   return $doc;
}

function XML_load_from_file($filename) {
   if ($fp = fopen($filename, 'r')) {
      $xml_parser = xml_parser_create();
      xml_set_element_handler($xml_parser, 'XML_parse_start', 'XML_parse_end');
      xml_set_character_data_handler($xml_parser, 'XML_parse_data');

      $doc = new XMLNode();
      $GLOBALS['doc_bc'] = array(&$doc);

      while ($data = fread($fp, 4096)) if (!xml_parse($xml_parser, $data, feof($fp))) die( sprintf(
         "XML error: %s at line %d",
         xml_error_string(xml_get_error_code($xml_parser)),
         xml_get_current_line_number($xml_parser)
         ) );
      
      xml_parser_free($xml_parser);
      fclose($fp);
      unset($GLOBALS['doc_bc']);
   
      return $doc;
   }
   else die('Could not open file: ' . $filename);
}


Χρησιμοποιήστε τις XML_load_from_text() και XML_load_from_file() και σας γυρνάει ένα nested XMLNode class.

Παράδειγμα:

κώδικας:
$document = XML_load_from_file('/path/to/document.xml');


Αν θέλετε να αλλάξετε τις τιμές μπορείτε να το κάνετε με το XMLNode::n()

Παράδειγμα:

κώδικας:
$document->n('node1')->n('node2')->n('node3')->nodeValue = 'Νέα τιμή';


Αν θέλετε να βγάλετε ένα pointer σε κάποιο node επίσης χρησιμοποιήστε την XMLNode::n() αλλά με ένα &

Παράδειγμα:

κώδικας:
$node = &$document->n('node1')->n('node2')->n('node3');



enjoy Another pint of beer

_________________
Imagine Creative Pulse
panosru
WebDev Moderator

Μέλος από: 13 Σεπ 2005
Βοηθήματα: 2
Scripts: 2
Μηνύματα: 256+

Περιοχή: Camp
View users profile
ΜήνυμαΣτις: 19 Φεβ 2007 17:27    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Poly oraio cpulse to metafero sthn kathgoria "PHP τα δικά μας scripts" kai afhno ena shadow sto topic sthn kathgoria "PHP Προγραμματισμός"
Banavas
Script Master

Μέλος από: 21 Νοε 2004
Βοηθήματα: 2
Templates: 1
Scripts: 2
Μηνύματα: 256+


View users profile Send email to user Visit posters website
ΜήνυμαΣτις: 19 Φεβ 2007 22:21    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Mήπως θα μπορούσες να μας δώσεις κάποιο πιο αναλυτικό παράδειγμα χρήσης που να περιλαμβάνει και κάποιο μικρό αρχείο;

_________________
Happy coding....
Μάρκος
http://lasernet.gr
cpulse
Script Master

Μέλος από: 21 Μαρ 2006
Βοηθήματα: 8
Νέα: 1
Scripts: 3
Μηνύματα: 256+

Περιοχή: Αθήνα village
View users profile Visit posters website
ΜήνυμαΣτις: 19 Φεβ 2007 23:18    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Γιατί όχι

Λοιπόν πριν το πω, να ξεκαθαρίσω οτι κάθε XML tag αντιστοιχεί σε ένα XMLNode, και άρα έχει properties: $nodeName, $nodeValue, $attrs, $nodes

Επίσης ο parser της PHP αποθηκεύει όλα τα node names και attribute keys σε upper case. Οπότε το $nodeName και τα keys του $attrs είναι σε κεφαλαία.

Για παράδειγμα τι καλύτερο από ένα RSS. Για να μην διαλυθεί ο κώδικας σε αρχεία το γράφω εδώ με here document.

κώδικας:

$q = '?';

$data = <<<EOF
<{$q}xml version="1.0" encoding="iso-8859-1" {$q}>
<rss version="2.0">
   <channel>
      <title>Example News</title>
      <link>http://www.example.com/news.php</link>
      <lastBuildDate>Mon, 19 Feb 2007 12:00:00 GMT</lastBuildDate>
      <managingEditor>info@example.com</managingEditor>
      <webMaster>info@example.com</webMaster>
      <item>
         <title>News bulletin 1</title>
         <description>
            This is a description
            for the news bulletin 1
         </description>
         <pubDate>Mon, 19 Feb 2007 12:00:00 GMT</pubDate>
      </item>
      <item>
         <title>News bulletin 2</title>
         <description>
            This is a description
            for the news bulletin 2
         </description>
         <pubDate>Tue, 20 Feb 2007 12:00:00 GMT</pubDate>
      </item>
   </channel>
</rss>

EOF;

$doc = XML_load_from_text($data);

echo '<h1>Title: ' . $doc->n('rss')->n('channel')->n('title')->nodeValue . '</h1>' . "\n";

echo '<ul>' . "\n";
foreach ($doc->n('rss')->n('channel')->nodes as $node) {
   if ($node->nodeName == 'ITEM') {
      echo '<li>' . $node->n('title')->nodeValue . '</li>' . "\n";
   }
}
echo '</ul>' . "\n";


Αυτό όλο βγάζει:

κώδικας:

<h1>Title: Example News</h1>
<ul>
<li>News bulletin 1</li>
<li>News bulletin 2</li>
</ul>


Επίσης μπορεί κάποιος να δεί καλύτερα τη δομή με ένα var_export($doc);

_________________
Imagine Creative Pulse
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [4 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » PHP Προγραμματισμός και εφαρμογές » PHP τα δικά μας scripts
Τώρα είναι 07 Δεκ 2016 20:12 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos