PHP: автоматически генерируемые объекты возврата каретки XML появляются с SimpleXML и xpath - PullRequest
3 голосов
/ 27 июня 2009

Я использую SimpleXML и xpath для чтения элементов из внешнего XTTML-документа UTF-8. Затем я итеративно повторяю вывод функции asXML () SimpleXML, выполняемой для каждого элемента, возвращаемого из селектора xpath. Но сущность возврата каретки XML досадно вставляется после каждой строки моего кода . В документе XHTML нет никаких дополнительных символов. Чем это вызвано? Похоже, что я перебираю каждый элемент массива, возвращаемый из xpath . Я не получаю сущности, когда просто выводю один элемент напрямую из asXML () SimpleXML (без использования xpath).

<?php
$content = new DOMDocument();
$content->loadHTMLFile(CONTENT.html);
$story = simplexml_import_dom($content->getElementById('story'));
$topics = $story->xpath('div[@class="topic"]');
foreach ($topics as $topic) {
    $topicContents = $topic->xpath('div/child::node()'); // Array of elements within 'content'.
    foreach ($topicContents as $contentElement) {
        echo $contentElement->asXML();
    }
}
?>

Выдержка из выведенного кода XHTML с автоматически сгенерированным возвратом каретки XML:

<div class="content">&#13;
<p>Lorem ipsum dolor sit amet</p>&#13;
<h2>Lorem ipsum</h2>&#13;
<p>Lorem ipsum dolor sit amet</p>&#13;
<ul>
    <li>Lorem ipsum</li>&#13;
    <li>Lorem ipsum</li>&#13;
    <li>Lorem ipsum</li>&#13;

1 Ответ

2 голосов
/ 28 июня 2009

Вот как libxml обрабатывает \ r в текстовых узлах.

<code><?php
$xml = <<< XML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="en">
    <head>
        <title>...</title>
    </head>
    <body><pre>a\nb<b>\r\n</b>c
XML;
$ content = new DOMDocument (); $ Контент-> loadhtml ($ XML); $ content = simplexml_import_dom ($ content); echo $ content-> asxml (); печатает
<html lang="en"><head><title>...</title></head><body><pre>a
b<b>&#13;</b>
c
(символы \ n «оставлены в покое», а \ r \ n обрабатывается как \ П)
Я не эксперт XML, но я думаю в соответствии с http://www.w3.org/TR/REC-xml/#sec-line-ends
To, чтобы упростить задачи приложений, процессор XML ДОЛЖЕН вести себя так, как будто он нормализует все разрывы строк во внешних проанализированных объектах (включая документ на входе перед синтаксическим анализом путем преобразования двухсимвольной последовательности #xD #xA и любого #xD, за которым не следует #xA, в один символ #xA.
он должен обрабатывать \ r \ n как один \ n, но это не так.
Если это не доставляет вам серьезных неприятностей, просто живите с этим ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...