PHP DOMDocument-> loadXML与XML包含&符号/更少/更大?

时间:2010-01-12 13:59:07

标签: php xml domdocument ampersand

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

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

我可以使用str_replace对所有&编码,但是如果我用<或者>我也在为有效的XML标签做这件事。

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

谢谢!

4 个答案:

答案 0 :(得分:5)

如果你有&lt; XML中的内部文本... 它不是有效的XML 。尝试对其进行编码或将其封装到<![CDATA[

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

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

答案 1 :(得分:3)

我经常在对DomDocument的load()调用前使用@,主要是因为你永远不能完全确定你加载的是什么。

使用@可以抑制错误。

@$dom->loadXml($myXml);

答案 2 :(得分:1)

  

我可以使用str_replace对所有&amp;编码,但是如果我用&lt;或者&gt;我也在为有效的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

答案 3 :(得分:0)

将所有文字放在CDATA元素中?

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

<!-- New -->
<blah><![CDATA[
    x & y < 3
]]></blah>
相关问题