xml_parser
создает здесь несколько событий по причине, которую я до конца не понял, я думаю, что это из-за автоопределения кодировки.
Вы можете справиться с этим, создав свой собственныйкласс парсера.Это вообще полезно в любом случае, не только в этом случае.Но для этого случая особенно важно, чтобы вы могли собрать текст метки, которая будет распределена по нескольким событиям.
Основная работа - сделать функции обратного вызова общедоступной функцией класса, а затем зарегистрировать эти функции.
Затем каждый раз, когда открывается тег label
, временное хранилище сбрасывается.Когда появляется текст, он добавляется во временное хранилище.Если тег label
закрывается, вы можете передать этот текст новому «событию», на этот раз функции, которую вы ищете, с ее текстом:
$variableParser = new VariableParser($parser);
$file = 'data://,'.$xml;
$fp = fopen($file, 'r');
while(!feof($fp)) { $data = fread($fp, 4096); xml_parse($parser, $data, feof($fp)); }
class VariableParser
{
private $label = ''; # place for the label text
public function doLabel($text)
{
printf("[%s]<br />\n", $text);
}
public function __construct($parser = NULL)
{
if ($parser) $this->register($parser);
}
public function register($parser)
{
xml_set_element_handler($parser, array($this, "startTag"), array($this, "endTag"));
xml_set_default_handler($parser, array($this, 'defaultHandler'));
}
public function startTag($parser, $name, $attributes)
{
if ($name === 'label') $this->label = '';
}
function endTag($parser, $name)
{
if ($name === 'label')
{
$this->doLabel($this->label);
$this->label = '';
}
}
function defaultHandler($parser, $data)
{
if(strlen(trim($data)) > 0)
{
$this->label .= $data;
}
}
}