使用php解析xml会为带有撇号的街道名称生成错误

时间:2017-08-21 08:17:10

标签: php xml

我正在尝试使用php解析xml。我建立了与数据库的连接,并尝试使用php获取行,然后将它们输入到谷歌地图的xml标记中。我的名字中有撇号的街道有问题(例如Charles de Gaulle'a):

header('Content-type: application/xml; charset="utf-8"');
echo '<?xml version="1.0" encoding="utf-8"?>';

print "<markers>\n";

while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {

    $location = "<mar ";
    $location .= ' LGT=' . "'" . (str_replace(',', '.', $row['Longtitude'])) . "'";
    $location .= ' LAT=' . "'" . (str_replace(',', '.', $row['Latitude'])) . "'";
    $location .= ' STREET=' . "'" . ($row['STREET']) . "'";
    $location .= " />\n";
    $output = $location;

    print ($output);
}
print "</markers>\n";

当里面没有带撇号的街道时,这样可以正常工作,但是在这条街上它会返回错误:

XML Parsing Error: not well-formed
Location: http://mywebsite.com/parsexml.php
Line Number 5178, Column 141:

问题是如何修复它以便不返回xml解析错误并且生成标记没有任何问题。

谢谢

2 个答案:

答案 0 :(得分:2)

您的问题是引号与对该属性进行舍入相同,最后以STREET='Charles de Gaulle'a'为结尾,因此将它们更改为&#34;而不是&#39; ...

$location .= ' STREET="' . ($row['STREET']) . '"';

可能存在其他字符导致问题的情况,但这应解决您的直接问题。

如果你把它作为一个实际的实体(而不是一个属性)会更好,这将解决大多数问题。所以......

<Street>Charles de Gaulle'a</Street>

答案 1 :(得分:1)

您需要使用htmlentities()对数据进行编码。更改报价只会在使用其他报价时导致问题。你应该总是使用htmlentities()。