simplexml_load_file给出了不起作用的读取节点,其中包含带查询字符串的url?

时间:2014-07-05 19:38:44

标签: php xml parsing xml-parsing

我正在使用简单项目从xml读取数据并保存到数据库中。但是我在阅读XML文件时遇到了一个问题。一些简要说明如下:

我的 parser.php 代码:

if (file_exists('zero.xml')) {
    $xml = simplexml_load_file('zero.xml');

    echo $xml->productURL;
} else {
    exit('Failed to open test.xml.');
}

zero.xml 文件包含:

<product sku="107">
    <price>6999</price>
    <productURL>https://www.example.com/in/open.pl?user_id=2&b=96</productURL>
</product>

运行代码时,没有任何输出只是警告。

  

EntityRef:期待&#39 ;;&#39;在C:\ xampp \ htdocs \ sqlsvr2012 \ parser.php上   第31行

当我更换&#34;&amp;&#34; url中的运算符

  

USER_ID = 2和b = 96

用;或者:然后这给我输出。但这不是确切的网址格式,这是不可接受的。我不知道为什么这不适用于&amp;运营商。请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

&不是有效的XML字符数据,因为它用于表示命名实体的开始。您有几个选项,包括将值括在CDATA块中,或者我首选的选项是使用&amp;实体?user_id=2&amp;b=96

实体示例

<productURL>https://www.example.com/in/open.pl?user_id=2&amp;b=96</productURL>

CDATA示例

<productURL><![CDATA[https://www.example.com/in/open.pl?user_id=2&b=96]]></productURL>

XML规范在此问题上说明如下:

  

&符号(&amp;)和左尖括号(&lt;)不得以其文字形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分。如果在其他地方需要它们,则必须使用数字字符引用或字符串&#34;来转义它们。 &安培; &#34;和&#34; &LT; &#34;分别。

     

- http://www.w3.org/TR/REC-xml/#syntax

答案 1 :(得分:0)

我正在为salathe添加一些不太理想的解决方案,但会起作用。您可能必须加载文件内容并执行查找和替换操作str_replace(),如& -> &amp;,并将精炼内容传递给简单的xml解析器

<?php

$path_to_file = 'path/to/the/file.xml';
$file_contents = file_get_contents($path_to_file);
$file_contents = str_replace("&",",&amp;",$file_contents);

simplexml_load_string($file_contents);

?>

希望这可能有所帮助!