我正在尝试解析XML文件,其中一个字段如下所示:
<link>http://foo.com/this-platform/scripts/click.php?var_a=a&var_b=b&varc=http%3A%2F%2Fwww.foo.com%2Fthis-section-here%2Fperf%2F229408%3Fvalue%3D0222%26some_variable%3Dmeee</link>
这似乎打破了解析器。我认为这可能与&amp; amp;在链接?
我的代码非常简单:
<?
$xml = simplexml_load_file("files/this.xml");
echo $xml->getName() . "<br />";
foreach($xml->children() as $child) {
echo $child->getName() . ": " . $child . "<br />";
}
?>
任何想法如何解决这个问题?
答案 0 :(得分:4)
您发布的XML代码段无效。 &符号必须被转义,这就是解析器投诉的原因。
答案 1 :(得分:3)
您的XML Feed无效XML:&
应转发为&
这意味着你不能在其上使用XML解析器: - (
一个可能的“解决方案”(感觉不对,但应该有用)将用“&
”替换不属于实体的“&
”,在使用XML解析器加载之前获取有效的XML字符串。
在你的情况下,考虑到这一点:
$str = <<<STR
<xml>
<link>http://foo.com/this-platform/scripts/click.php?var_a=a&var_b=b&varc=http%3A%2F%2Fwww.foo.com%2Fthis-section-here%2Fperf%2F229408%3Fvalue%3D0222%26some_variable%3Dmeee</link>
</xml>
STR;
您可以使用对str_replace
的简单调用,如下所示:
$str = str_replace('&', '&', $str);
然后,解析$str
中的字符串(现在是XML有效的):
$xml = simplexml_load_string($str);
var_dump($xml);
在这种情况下,它应该有用......
但请注意,您必须注意实体:如果您已经拥有“>
”这样的实体,则不得将其替换为“&gt;
”!
这意味着对str_replace
的这种简单调用不是正确的解决方案:它可能会破坏许多XML Feed的内容!
由你来找到正确的替代方法 - 也许是某种正则表达式......
答案 2 :(得分:2)
由于您的XML无效,它会破解解析器 - &
应编码为&
。
答案 3 :(得分:1)
如果您的XML已经有一些转义,这种方式将被保留,未转义的&符号将被修复:
$brokenXmlText = file_get_contents("files/this.xml");
$fixed = preg_replace('/&(?!lt;|gt;|quot;|apos;|amp;|#)/', '&', $brokenXmlText);
$xml = simplexml_load_string($fixed);
答案 4 :(得分:0)
mjv的评论解决了这个问题:
除了使用&amp;之外,你可以 考虑把网址和其他 XML中不友好的内容 ,即a 字符数据块
答案 5 :(得分:0)