XML to object για PHP 4

Μια περιοχή όπου τα μέλη μας μπορούν να βάζουν τα PHP scripts που έχουν φτιάξει και θέλουν να τα μοιραστούν με τα υπόλοιπα μέλη.

Συντονιστές: Super-Moderators, WebDev Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

XML to object για PHP 4

Δημοσίευση από cpulse » 19 Φεβ 2007 17:18

Προβλήματα με 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 :pint:

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

XML to object για PHP 4

Δημοσίευση από panosru » 19 Φεβ 2007 17:27

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

Άβαταρ μέλους
Banavas
Script Master
Δημοσιεύσεις: 1367
Εγγραφή: 21 Νοέμ 2004 20:25
Επικοινωνία:

XML to object για PHP 4

Δημοσίευση από Banavas » 19 Φεβ 2007 22:21

Mήπως θα μπορούσες να μας δώσεις κάποιο πιο αναλυτικό παράδειγμα χρήσης που να περιλαμβάνει και κάποιο μικρό αρχείο;
Happy coding....
Μάρκος
http://lasernet.gr

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

XML to object για PHP 4

Δημοσίευση από cpulse » 19 Φεβ 2007 23:18

Γιατί όχι :)

Λοιπόν πριν το πω, να ξεκαθαρίσω οτι κάθε 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
<&#123;$q&#125;xml version="1.0" encoding="iso-8859-1" &#123;$q&#125;>
<rss version="2.0">
	<channel>
		<title>Example News</title>
		<link>http&#58;//www.example.com/news.php</link>
		<lastBuildDate>Mon, 19 Feb 2007 12&#58;00&#58;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&#58;00&#58;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&#58;00&#58;00 GMT</pubDate>
		</item>
	</channel>
</rss>

EOF;

$doc = XML_load_from_text&#40;$data&#41;;

echo '<h1>Title&#58; ' . $doc->n&#40;'rss'&#41;->n&#40;'channel'&#41;->n&#40;'title'&#41;->nodeValue . '</h1>' . "\n";

echo '<ul>' . "\n";
foreach &#40;$doc->n&#40;'rss'&#41;->n&#40;'channel'&#41;->nodes as $node&#41; &#123;
	if &#40;$node->nodeName == 'ITEM'&#41; &#123;
		echo '<li>' . $node->n&#40;'title'&#41;->nodeValue . '</li>' . "\n";
	&#125;
&#125;
echo '</ul>' . "\n";
Αυτό όλο βγάζει:

Κώδικας: Επιλογή όλων

<h1>Title&#58; Example News</h1>
<ul>
<li>News bulletin 1</li>
<li>News bulletin 2</li>
</ul>
Επίσης μπορεί κάποιος να δεί καλύτερα τη δομή με ένα var_export($doc);

Απάντηση

Επιστροφή στο “PHP τα δικά μας scripts”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες