note 23526 added to function.xml-parse-into-struct
| From: | farinspace-at-hotmail-dot-com@php.net | Date: | Sat, 20 Jul 2002 22:41:50 +0000 |
| Subject: | note 23526 added to function.xml-parse-into-struct | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-33350@lists.php.net to get a copy of this message | ||
Wow, took a while to consume all of this. I am a noobie at XML, in fact i just really started
working with it today. I went ahead and added to the above code by gdemartini@bol.com.br. I also
added the update by nyk@cowham.net.
Added 'value' => $vals[$i]['value'] to the open case, as some nodes have both
cdata as well as a children node. In previous versions of the functions the cdata of a node(a) that
also had children would get stored in the children's array of the parent node(a). Now only
children values are in the children array and the cdata is in the value key of the parent node(a).
Added 'value' => $vals[$i]['value'] to tree array as the vals array produced
by PHP includes a value to the top most node if no children exist (for completeness).
Also, using xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,1) will strip all white space from
both around the XML tags as well as inside the cdata. I added a piece of code by waldo@wh-e.com to
take care of this. All SPACE characters are now only stripped from around the XML tags and cdata
spacing is retained.
CODE:
***************************************
function GetChildren($vals, &$i) {
$children = array();
while (++$i < sizeof($vals)) {
// compair type
switch ($vals[$i]['type']) {
case 'cdata':
$children[] = $vals[$i]['value'];
break;
case 'complete':
$children[] = array(
'tag' => $vals[$i]['tag'],
'attributes' => $vals[$i]['attributes'],
'value' => $vals[$i]['value']
);
break;
case 'open':
$children[] = array(
'tag' => $vals[$i]['tag'],
'attributes' => $vals[$i]['attributes'],
'value' => $vals[$i]['value'],
'children' => GetChildren($vals, $i)
);
break;
case 'close':
return $children;
}
}
}
function GetXMLTree($file) {
$data = implode('', file($file));
// by: waldo@wh-e.com - trim space around tags not within
$data =
eregi_replace(">"."[[:space:]]+"."<","><",$data);
// XML functions
$p = xml_parser_create();
// by: anony@mous.com - meets XML 1.0 specification
xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
xml_parse_into_struct($p, $data, &$vals, &$index);
xml_parser_free($p);
$i = 0;
$tree = array();
$tree[] = array(
'tag' => $vals[$i]['tag'],
'attributes' => $vals[$i]['attributes'],
'value' => $vals[$i]['value'],
'children' => GetChildren($vals, $i)
);
return $tree;
}
***************************************
--
http://www.php.net/manual/en/function.xml-parse-into-struct.php
http://master.php.net/manage/user-notes.php?action=edit+23526
http://master.php.net/manage/user-notes.php?action=delete+23526
http://master.php.net/manage/user-notes.php?action=reject+23526