note 85970 added to function.xml-set-element-handler
| From: | kok at nachon dot nl | Date: | Fri, 26 Sep 2008 13:44:42 +0000 |
| Subject: | note 85970 added to function.xml-set-element-handler | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-144745@lists.php.net to get a copy of this message | ||
Here is another example of detecting empty elements. I works with libxml2. Note that it handles
buffer boundaries.
<?php
$depth = 0; //current depth, used for pretty printing
$empty = false; //whether the tag is empty
$offset = 0; //the index of the start of the current buffer within the stream
function tagStart($parser, $name, array $attribs) {
global $depth, $empty, $data, $offset, $lastchar;
$idx = xml_get_current_byte_index($parser);
/* xml_get_current_byte_index returns index within the streams and not
within the buffer.*/
/* Check if the index is within the buffer. */
if (isset($data[$idx - $offset])) {
$c = $data[$idx - $offset];
} else {
/* If it isn't simple use the last character of the buffer. */
$c = $lastchar;
}
$empty = $c == '/';
echo str_repeat("\t", $depth), "<$name", ($empty ? '/>' :
'>'), "\n";
if (!$empty) ++$depth;
}
function tagEnd($parser, $name) {
global $depth, $empty;
if (!$empty) {
--$depth;
echo str_repeat("\t", $depth), "</$name>\n";
} else {
$empty = false;
}
}
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($parser, 'tagStart', 'tagEnd');
$data1 = '
<test>
<empty att="3" />
<nocontent></nocontent>
<content>
<empty/>
<empty/>
</content>
<empty/';
$data2 = '>
<empty att="5" />
</test>
';
$data = &$data1;
$length = strlen($data1);
$lastchar = $data[$length-1];
xml_parse($parser, $data1);
$offset .= $length;
$data = &$data2;
xml_parse($parser, $data2);
----
Server IP: 83.137.20.135
Probable Submitter: 87.195.31.90
----
Manual Page -- http://www.php.net/manual/en/function.xml-set-element-handler.php
Edit -- https://master.php.net/note/edit/85970
Del: integrated -- https://master.php.net/note/delete/85970/integrated
Del: useless -- https://master.php.net/note/delete/85970/useless
Del: bad code -- https://master.php.net/note/delete/85970/bad+code
Del: spam -- https://master.php.net/note/delete/85970/spam
Del: non-english -- https://master.php.net/note/delete/85970/non-english
Del: in docs -- https://master.php.net/note/delete/85970/in+docs
Del: other reasons-- https://master.php.net/note/delete/85970
Reject -- https://master.php.net/note/reject/85970
Search -- https://master.php.net/manage/user-notes.php