XmlReader не может читать пустые узлы, такие как Chrome Reader - PullRequest
1 голос
/ 23 ноября 2011

У меня проблема с чтением пустых элементов, отформатированных как <eanCode/>.После этого элемента класс XmlReader не может прочитать следующий элемент.

<EanCode/><Stock>15</Stock>

if ($reader->nodeType == XMLReader::ELEMENT) {
            switch ($reader->name) {

           case 'Stock':
                    $reader->read();
                    $stock = $reader->value;
            ECHO 'stokkk adet = '. $stock;
                    break;...

Итак, я решил заменить <eanCode/> на <eanCode></eanCode>.Но сложно написать алгоритм.Кто-нибудь может предоставить соответствующий метод замены preg, пожалуйста?

Ответы [ 2 ]

8 голосов
/ 25 апреля 2012

В XMLReader есть проблема.

Если у вас есть такой пустой элемент: <test></test>

Вы получите ЭЛЕМЕНТ и END_ELEMENT.

Однако, если вы используете самозакрывающийся тег: <test />

Вы получаете только ЭЛЕМЕНТ, и НЕТ END_ELEMENT.

Простое решение - проверить, если $xmlReader->isEmptyElement на каждом УЗЛЕ ЭЛЕМЕНТА. Это позволит вам узнать, является ли это самозакрывающимся тегом, затем вы можете его пропустить.

0 голосов
/ 23 ноября 2011

Пожалуйста, попробуйте:

$result = preg_replace('%<EanCode/>%', '<EanCode></EanCode>', $string);

Также вы можете проверить, является ли элемент пустым:

$xml = new XMLReader();
$xml->XML('<tag attr="value" />');
$xml->read();
var_dump($xml->isEmptyElement);
...