PHP:自动生成的 XML 回车实体出现 w/SimpleXML 和 xpath

标签 php html xml xpath

我正在使用 SimpleXML 和 xpath 从外部 UTF-8 XHTML 文档中读取元素。然后,我迭代地回显 SimpleXML 的 asXML() 函数对从 xpath 选择器返回的每个元素执行的输出。但是 XML 回车实体很烦人,在我的代码的每一行之后插入。 XHTML 文档中没有任何额外的字符。是什么原因造成的?这似乎是我遍历从 xpath 返回的每个数组元素的方式。当我只是直接从 SimpleXML 的 asXML()(不使用 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();
    }
}
?>

带有自动生成的 XML 回车符的输出 XHTML 代码摘录:

<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;

最佳答案

这就是 libxml 处理文本节点中的\r 的方式。

<?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</pre></body>
</html>
XML;<br/>
$content = new DOMDocument();
$content->loadhtml($xml);
$content = simplexml_import_dom($content);
echo $content->asxml();
版画
<html lang="en"><head><title>...</title></head><body><pre>a
b&#13;
c</pre></body></html>
(\n 字符“单独放置”,而\r\n 被处理为 \n)
我不是 XML 专家,但我认为根据http://www.w3.org/TR/REC-xml/#sec-line-ends
To simplify the tasks of applications, the XML processor MUST behave as if it normalized all line breaks in external parsed entities (including the document entity) on input, before parsing, by translating both the two-character sequence #xD #xA and any #xD that is not followed by #xA to a single #xA character.
它应该将\r\n 视为单个\n 但它没有。
如果它不会给你带来严重的麻烦,那就忍受吧......

关于PHP:自动生成的 XML 回车实体出现 w/SimpleXML 和 xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053429/

相关文章:

java - 编写可使用 Set 属性转换为 Java 的 xml 模式

php - 如何跳过有关使用 Maatwebsite/Laravel-Excel 导入 excel laravel 的行

php - 处理查询结果中的引号 PHP

html - 谷歌浏览器 - HTML5 音频和 WAV 文件

javascript - 覆盖按钮未出现在 IE 上

php - 如何使用 PHP 获取原始 POST 数据并保存到文件中?

php - 员工仅具有添加和编辑其产品的权限

php - 在sql数据库中存储html代码问题

html - Flexbox 阻碍利润率得到尊重

xml - 如何编写一个简单的 Ragel 分词器(无回溯)?