【问题标题】:Parsing XML using PHP - Which includes ampersands and other characters使用 PHP 解析 XML - 包括 & 和其他字符
【发布时间】:2010-11-29 05:09:33
【问题描述】:

我正在尝试解析一个 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 = simplexml_load_file("files/this.xml");

echo $xml->getName() . "<br />";

foreach($xml->children() as $child) {
  echo $child->getName() . ": " . $child . "<br />";
}
?>

有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: php xml parsing


    【解决方案1】:

    如果您的 XML 已经有一些转义,这样它将被保留并且未转义的 & 符号将被修复:

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

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

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

        除了使用 &,您还可以 考虑把网址和其他 中的 XML 不友好内容 ,即一个 字符数据块

        【讨论】:

          【解决方案4】:

          您的 XML 提要不是有效的 XML:&amp;amp; 应转义为 &amp;amp;

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

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

          在这种情况下,它应该可以工作......


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

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

          由您来找到进行替换的正确方法——也许使用某种正则表达式...

          【讨论】:

            【解决方案5】:

            您发布的 XML sn-p 无效。 & 符号必须被转义,这就是解析器抱怨的原因。

            【讨论】:

            • 很遗憾,我无法更改提要,所以除了正则表达式之外没有其他方法吗?
            【解决方案6】:

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

            【讨论】:

            • 除了使用 &,您可以考虑将 url 和其他对 XML 不友好的内容放在 中,即字符数据块
            • 很遗憾,我无法更改提要,所以除了正则表达式之外没有其他方法可以做到这一点吗?这会: 修复它吗? (如果我可以更改文件?)
            • Mjv - 如果您想以答案的形式发表评论,我会接受,因为它现在让生活更轻松,而且我的 xml“有效”...
            猜你喜欢
            • 2012-11-14
            • 1970-01-01
            • 2023-03-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-27
            • 2016-05-07
            • 1970-01-01
            相关资源
            最近更新 更多