我使用以下代码获取XML的内容:
$xml = simplexml_load_file("X.xml");
echo $xml->CountryList->Country[1];
这是X.xml:
<PickUpCityListRQ>
<CountryList>
<Country>Albania</Country>
<Country>Andorra</Country>
</CountryList>
</PickUpCityListRQ>
一切正常,它为我返回安道尔,但是,当我尝试使用特殊字符的网址时,就像这个:
http://somelink/ServiceRequest.do?xml=<PickUpCityListRQ><Credentials username='USERNAME' password='PASSWORD' remoteIp='IP'/><Country>UK</Country></PickUpCityListRQ>
此链接不适合您,因为它只是一个示例,但相信,真实链接返回与X.xml相同的内容。我知道其中的原因是链接中的特殊字符,但我无法使其工作。我试过这样的事情:
$username = "USERNAME";
$password = "PASSWORD";
$accessurl = htmlspecialchars("Credentials username='$username' password='$password' remoteIp='123.123.123.123'/");
$required = htmlspecialchars("<PickUpCityListRQ><$accessurl><Country>UK</Country></PickUpCityListRQ>");
$url = 'somelink/service/ServiceRequest.do?xml='.$required;
echo $url;
它返回(带有echo)所需的链接,如果我手动使用它(在浏览器中)我将获得所需的内容。但是,如果我尝试使用此代码获取XML内容:
$xml = simplexml_load_file($url);
echo $xml->CountryList->Country[1];
我不会工作。 有任何想法吗? 提前谢谢。
答案 0 :(得分:2)
htmlspecialchars
用于保护HTML内容页面中的特殊字符(特别是在用户输入上,以避免某种XSS或其他攻击......)。
当您操纵网址时,您应该使用urlencode
来发送您的内容作为网址的参数。
所以你的网址是:
http://someserver/somethink/services/ServiceRequest.do?xml=%3CPickUpCityListRQ%3E%3CCredentials%20username%3D'USERNAME'%20password%3D'PASSWORD'%20remoteIp%3D'IP'%2F%3E%3CCountry%3EUK%3C%2FCountry%3E%3C%2FPickUpCityListRQ%3E
正如文档所说,urldecode
并不是必需的,因为超级全局$ _GET和$ _REQUEST已经被urldecoded。因此,在执行此任务的脚本中,您可以直接使用$ _GET条目中的值。
$xml = simplexml_load_string($_GET['xml']);
文档:urlencode
答案 1 :(得分:0)
从PHP simplexml_load_file with special chars in URL
中被盗的答案使用此
$username = "USERNAME";
$password = "PASSWORD";
$accessurl = "Credentials username='$username' password='$password' remoteIp='123.123.123.123'/";
$required = "<PickUpCityListRQ><$accessurl><Country>UK</Country></PickUpCityListRQ>";
$url= rawurlencode("somelink/service/ServiceRequest.do?xml={$required}");
$xml = simplexml_load_file($url);
echo $xml->CountryList->Country[1];