使用PHP解析XML - 包括&符号和其他字符

时间:2009-09-17 16:06:07

标签: php xml parsing

我正在尝试解析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 />";
}
?>

任何想法如何解决这个问题?

6 个答案:

答案 0 :(得分:4)

您发布的XML代码段无效。 &符号必须被转义,这就是解析器投诉的原因。

答案 1 :(得分:3)

您的XML Feed无效XML:&应转发为&amp;

这意味着你不能在其上使用XML解析器: - (

一个可能的“解决方案”(感觉不对,但应该有用)将用“&”替换不属于实体的“&amp;”,在使用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('&', '&amp;', $str);

然后,解析$str中的字符串(现在是XML有效的)

$xml = simplexml_load_string($str);
var_dump($xml);

在这种情况下,它应该有用......


但请注意,您必须注意实体:如果您已经拥有“&gt;”这样的实体,则不得将其替换为“&amp;gt;”!

这意味着对str_replace的这种简单调用不是正确的解决方案:它可能会破坏许多XML Feed的内容!

由你来找到正确的替代方法 - 也许是某种正则表达式......

答案 2 :(得分:2)

由于您的XML无效,它会破解解析器 - &应编码为&amp;

答案 3 :(得分:1)

如果您的XML已经有一些转义,这种方式将被保留,未转义的&符号将被修复:

$brokenXmlText = file_get_contents("files/this.xml");
$fixed = preg_replace('/&(?!lt;|gt;|quot;|apos;|amp;|#)/', '&amp;', $brokenXmlText);
$xml = simplexml_load_string($fixed);

答案 4 :(得分:0)

mjv的评论解决了这个问题:

  

除了使用&amp;之外,你可以   考虑把网址和其他   XML中不友好的内容   ,即a   字符数据块

答案 5 :(得分:0)