1

我正在尝试解析 TEXTDATA 中包含字符 & < 和 > 的 XML 字符串。通常,这些字符应该是 htmlencoded,但在我的情况下,它们不是,所以我收到以下消息:

警告:DOMDocument::loadXML() [function.loadXML]:在实体中解析属性名称时出错...警告:DOMDocument::loadXML() [function.loadXML]:找不到开始标记的结尾...

我可以使用 str_replace 对所有 & 进行编码,但如果我使用 < 或 > 进行编码,我也会对有效的 XML 标记进行编码。

有谁知道这个问题的解决方法?

谢谢!

4

4 回答 4

5

如果您在 XML 中有 < 内部文本...它不是有效的 XML。尝试对其进行编码或将它们包含在<![CDATA[.

如果不可能(因为您没有输出此“XML”),我建议尝试使用一些 Html 解析库(我没有使用它们,但它们存在),因为它们没有 XML 严格。

但在尝试任何其他事情之前,我真的会尝试获得有效的 XML!

于 2010-01-12T14:03:36.290 回答
3

我经常@在调用 DomDocument 的 load() 之前使用,主要是因为您永远无法绝对确定您加载的内容是您所期望的。

使用@将抑制错误。

@$dom->loadXml($myXml);
于 2010-01-12T14:03:09.170 回答
1

我可以使用 str_replace 对所有 & 进行编码,但如果我使用 < 或 > 进行编码,我也会对有效的 XML 标记进行编码。

作为严格的临时修复措施,您可以替换不属于标签或实体引用的那些,例如:

$str= preg_replace('<(?![a-zA-Z_!?])', '&lt;', $str);
$str= preg_replace('&(?!([a-zA-Z]+|#[0-9]+|#x[0-9a-fA-F]+);)', '&amp;', $str);

然而,这并不是无懈可击的,从长远来看,您需要修复产生这种虚假标记的任何东西,或者对需要修复它的人大喊大叫,直到他们得到线索。像这样的格式完全不正确的XML 根本不是 XML的定义。

于 2010-01-12T14:18:25.600 回答
0

将所有文本放入 CDATA 元素中?

<!-- Old -->
<blah>
    x & y < 3
</blah>

<!-- New -->
<blah><![CDATA[
    x & y < 3
]]></blah>
于 2010-01-12T14:04:13.277 回答