如何解决“simplexml_load_file()解析器错误:实体'未定义”?

时间:2011-06-01 23:08:13

标签: php xml symbols

我使用PHP生成XML文件。我在下面使用了一些代码来避免错误。

$str = str_ireplace(array('<','>','&','\'','"'),array('&lt;','&gt;','&amp;','&apos;','&quot;'),$str);

但仍然导致错误。

simplexml_load_file() [function.simplexml-load-file] *[file name]* parser error : Entity 'nbsp' not defined in *[file name] [line]*

错误文字在这里:

Dallas&nbsp;&nbsp;Dallas () is the third-largest city in Texas and the ninth-largest in the United States.

在IE8中,它似乎在()中出错。那么我应该注意多少个符号?

3 个答案:

答案 0 :(得分:4)

&nbsp;是一个HTML实体,但在XML中不存在。

要么摆脱它(你不是说它来自何处,所以很难提供任何更具体的建议),或者将你的HTML数据包装在CDATA块中,以便解析器忽略它们。

答案 1 :(得分:3)

HTML特定实体 - 在本例中为&nbsp; - 不是有效的xml实体,这就是simplexml抱怨的内容;它将文件读取为xml(而不是html)并查找无效的实体。您需要首先将HTML实体转换回其字符表示形式(您可以使用html_entity_decode()来执行此操作)

$str = "some string containing html";
// this line will convert back html entities to regular characters
$str = html_entity_decode($str, ...);
// now convert special character to their xml entities
$str = str_ireplace(array('<','>','&','\'','"'),array('&lt;','&gt;','&amp;','&apos;','&quot;'),$str);

save_to_xml($str);

请注意,如果您在字符串中使用htmlentities()然后将其保存在xml中,那么这就是问题的根源(因为您将html字符转换为各自的html实体,而simplexml无法将其识别为xml实体)。

// this won't work, the html entities it will uses are not valid xml entities
$str = htmlentities($str, ...)

save_to_xml($str);

如果你有理解它的麻烦,可以把它想象成两种不同的语言,比如西班牙语(html)和英语(xml),西班牙语()中的有效单词并不意味着它在英语中也是有效的,无论是两种语言之间的相似之处。

答案 2 :(得分:1)

&nbsp;是不间断的空间。你必须更换它。 http://en.wikipedia.org/wiki/Non-breaking_space