php 输出 xml 产生解析错误“'”

Posted

技术标签:

【中文标题】php 输出 xml 产生解析错误“\'”【英文标题】:php output xml produces parse error "’"php 输出 xml 产生解析错误“'” 【发布时间】:2011-03-09 17:22:57 【问题描述】:

是否有任何函数可以用来解析任何字符串以确保它不会导致 xml 解析问题?我有一个 php 脚本输出一个 xml 文件,其中包含从表单中获取的内容。

问题是,除了来自 php 表单的常见字符串检查外,一些用户文本会导致 xml 解析错误。我特别面对这个“’”。这是我收到的错误Entity 'rsquo' not defined

有没有人在为 xml 输出编码文本方面有经验?

谢谢!


一些澄清: 我正在从 xml 文件中的表单输出内容,随后由 javascript 解析。

我处理所有表单输入:htmlentities(trim($_POST['content']), ENT_QUOTES, 'UTF-8');

当我想将此内容输出到 xml 文件中时,我应该如何对其进行编码以使其不会引发 xml 解析错误?

到目前为止,以下 2 个解决方案有效:

1)echo '<content><![CDATA['.$content.']]></content>';

2)echo '<content>'.htmlspecialchars(html_entity_decode($content, ENT_QUOTES, 'UTF-8'),ENT_QUOTES, 'UTF-8').'</content>'."\n";

以上两种解决方案安全吗?哪个更好?

谢谢,很抱歉没有早点提供此信息。

【问题讨论】:

我会使用 XML 解析器来查看 XML 解析器是否不会阻塞输入。 这里的问题是 XML 只知道很少的实体可以实际指定字符引用。 (见w3.org/TR/xml/#sec-predefined-ent) 【参考方案1】:
html_entity_decode($string, ENT_QUOTES, 'UTF-8')

【讨论】:

解决了’ 错误但现在出现& 错误?如果我将 & 更改为 & 它修复了错误,但我怎样才能正确解码所有内容? 是的。我正在输出 utf-8。我的 xml 输出以 echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n"; 开头,谢谢【参考方案2】:

你把它弄错了——不要寻找不会给你错误的解析器。而是尝试使用格式良好的 xml。

您是如何从用户那里获得’ 的?如果他按字面意思输入,则说明您没有正确处理输入 - 例如,您应该将 & 转义为 &。如果是你把实体放在那里(也许代替一些撇号),要么在 DTD 中定义它(<!ENTITY rsquo "&x2019;">),要么使用数字符号(’)编写它,因为几乎每个命名实体都是HTML 的一部分。正如 Gumbo 指出的那样,XML 只定义了一些基本的。

根据对问题的补充进行编辑:

在 #1 中,如果用户键入 ]]> <°)))><,则您会转义内容。 在 #2 中,您正在进行编码和解码,这会导致 $content 的原始值。解码应该不是必需的(如果您不希望用户发布类似的值& 应该被解释为 &)。

如果您将 htmlspecialchars() 与 ENT_QUOTES 一起使用,应该没问题,但请参阅 how Drupal does it。

【讨论】:

感谢 Krab。我对用户输入所做的就是让他们通过这个:htmlentities($_POST['content'], ENT_QUOTES, 'UTF-8');。 sleepynate 建议使用 html_entity_decode 修复了’,因为它将它转换回来..但后来我遇到了& 的问题。我该怎么办?这 htmlspecialchars(html_entity_decode($content, ENT_QUOTES, 'UTF-8'),ENT_QUOTES, 'UTF-8') 是否足以确保将来的用户输入不会导致我的 xml 文件出现问题?我需要 xml 文件没有错误,因为 javascript 函数正在解析它。 有什么理由必须使用 htmlentities() 而不是 htmlspecialchars()? 实际上没有特别的原因.. htmlspecialchars() 是否足以处理所有用户输入?那么什么时候会使用 htmlentities() 呢? 所以实际上,如果我已经在 utf-8 中处理、保存和输出输入,我就不需要 htmlentities,而 htmlspecialchars 就足够了吗?谢谢! 也许您可以使用 htmlentities() 来生成包含 unicode 字符的文档,同时保留纯 ASCII 编码。但这仅在您还将字符编码为数字实体时才成立。我不知道。【参考方案3】:

将值括在 CDATA 标记中。

<message><![CDATA[&rsquo;]]></message>

来自w3schools site:

像“

"

"&" 将产生错误,因为解析器将其解释为字符实体的开始。

有些文本,比如 JavaScript 代码,包含很多“

解析器会忽略 CDATA 部分中的所有内容。

【讨论】:

这是一个很好的解决方案,尽管我对未转义的 CDATA 在代码中的其他地方使用(例如,放入数据库)感到不寒而栗,尽管这与手头的问题。 这是关于 RSS 的正确答案,除非您使用 XHTML DTD。在CDATASection 中使用content:encoded 输出提要时特别有用。【参考方案4】:

问题是你的htmlentities 函数正在做它应该做的——从字符生成 HTML 实体。然后,您将这些插入到没有定义 HTML 实体的 XML 文档中(&amp;rsquo; 之类的东西是特定于 HTML 的)。

处理此问题的最简单方法是保持所有输入原始(即不要使用 htmlentities 解析),然后使用 PHP 的 XML 函数生成您的 XML。

这将确保所有文本都正确编码,并且您的 XML 格式正确。

例子:

$user_input = "...<>&'";

$doc = new DOMDocument('1.0','utf-8');

$element = $doc->createElement("content");
$element->appendChild($doc->createTextNode($user_input));

$doc->appendChild($element);

【讨论】:

感谢波热!目前我只是回显到一个 xml 文件中。我将使用 PHP 的 XML 函数正确生成一个 xml 文档。 :)【参考方案5】:

使用 htmlspecialchars() 将解决您的问题。请参阅下面的帖子。

PHP - Is htmlentities() sufficient for creating xml-safe values?

【讨论】:

【参考方案6】:

我有一个类似的问题,我需要添加到 XML 中的数据已经由我的代码作为 htmlentities() 返回(不在这样的数据库中)。

我用过:

$doc = new DOMDocument('1.0','utf-8');    
$element = $doc->createElement("content");    
$element->appendChild($doc->createElement('string', htmlspecialchars(html_entity_decode($string, ENT_QUOTES, 'UTF-8'), ENT_XML1, 'UTF-8')));
$doc->appendChild($element);

或者如果它不在 htmlentities() 中 只是下面应该工作

$doc = new DOMDocument('1.0','utf-8');

$element = $doc->createElement("content");       
$element->appendChild($doc->createElement('string', htmlspecialchars($string, ENT_XML1, 'UTF-8')));
$doc->appendChild($element);

基本上使用带有 ENT_XML1 的 htmlspecialchars 应该将用户估算的数据转换为 XML 安全数据(并且对我来说很好):

htmlspecialchars($string, ENT_XML1, 'UTF-8');

【讨论】:

【参考方案7】:
htmlspecialchars($trim($_POST['content'], ENT_XML1, 'UTF-8');

应该这样做。

【讨论】:

【参考方案8】:

这对我有用。遇到同样问题的人可以试试这个。

htmlentities($string, ENT_XML1)

带特殊字符的转换。

htmlspecialchars(htmlentities($string, ENT_XML1))

【讨论】:

以上是关于php 输出 xml 产生解析错误“'”的主要内容,如果未能解决你的问题,请参考以下文章

错误查询SQL在PHP中解析XML

PHP中用simpleXML解析XML文档,为啥总出错?

在javaXML dom解析的时候 输出错误 前言中不许有内容 这个问题是哪里的错误?

XML 解析错误:XML 或文本声明不在实体的开头

解析错误无效的 XML:601

XmlHTTPRequest:“XML 解析错误:未找到元素”