我正在尝试解析包含字符和字符的XML字符串。 <和>在TEXTDATA中。通常,这些字符应该是htmlencoded,但在我的情况下它们不是这样我得到以下消息:
警告:DOMDocument :: loadXML()[function.loadXML]:在实体中解析属性名称时出错... 警告:DOMDocument :: loadXML()[function.loadXML]:找不到开始标记的结尾...
我可以使用str_replace对所有&编码,但是如果我用<或者>我也在为有效的XML标签做这件事。
有没有人知道这个问题的解决方法?
谢谢!
答案 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_!?])', '<', $str);
$str= preg_replace('&(?!([a-zA-Z]+|#[0-9]+|#x[0-9a-fA-F]+);)', '&', $str);
然而,这不是水密的,从长远来看,你需要修复产生这种伪造标记的任何东西,或者对那些需要修复它的人大喊大叫直到他们得到线索。根据定义,像这样的非格式良好的XML 根本就不是XML 。
答案 3 :(得分:0)
将所有文字放在CDATA元素中?
<!-- Old -->
<blah>
x & y < 3
</blah>
<!-- New -->
<blah><![CDATA[
x & y < 3
]]></blah>