使用simplexml解析特殊字符xml文件

时间:2012-10-10 03:18:25

标签: php xml parsing simplexml special-characters

道歉,如果有明显的答案(我知道大约有1000个这样的类似问题) - 但我花了两天时间试图攻击这个没有成功。我似乎无法解决为什么我得到一个空响应...

简短背景:以下工作正常

$xurl= new SimpleXMLElement('https://gptxsw.appspot.com/view/submissionList?formId=GP_v7&numEntries=1', NULL,    TRUE);
$keyname = $xurl->idList->id[0];
echo $keyname;

这提供了一个响应:一个像uuid这样的唯一键:d0721391-6953-4d0b-b981-26e38f05d2e5

然而,我尝试了类似的请求(最终将基于第一个请求)并获得失败。我简化了以下代码......

$xdurl= new SimpleXMLElement('https://gptxsw.appspot.com/view/downloadSubmission?formId=GP_v7[@version=null%20and%20@uiVersion=null]/GP_v7[@key=uuid:d0721391-6953-4d0b-b981-26e38f05d2e5]', NULL, TRUE);
$keyname2 = $xdurl->data->GP_v7->SDD_ID_N[0];
echo $keyname2;

这提供了null。如果我尝试类似的东西     echo $ xdurl-> asXML(); 我收到了来自网站的错误响应(不是来自PHP)。

我是否需要从SimpleXMLElement中弹出第二个请求?我已经阅读了有关使用XPath和定义命名空间的内容,但我不确定是否需要这两个:第二个文件确实有两个命名空间,但其中一个没有使用,另一个没有元素前缀。此外,我尝试过各种变体 - 足以认为我的问题/错误本质上更具全局性(或由于缺乏经验而导致疏忽)。

出于此请求的目的,我无法控制任何XML文件的格式。

2 个答案:

答案 0 :(得分:0)

我们开始: SimpleXMLElement 似乎重新转义(或以某种方式错误处理)已经是url转义的字符,例如空格。尝试:

$xdurl= new SimpleXMLElement('https://gptxsw.appspot.com/view/downloadSubmission?formId=GP_v7[@version=null and @uiVersion=null]/GP_v7[@key=uuid:d0721391-6953-4d0b-b981-26e38f05d2e5]', NULL, TRUE);
$keyname2 = $xdurl->data->GP_v7->SDD_ID_N[0];
echo $keyname2;

你应该没事。

(仅供参考:我通过手动创建名为“foo.xml”的XML请求结果的本地副本进行了调试,该副本完美运行。)

答案 1 :(得分:0)

感谢@Matze让我走上正轨。 问题是URL具有特殊字符,SimpleXMLElement无法在没有帮助的情况下解析。

解决方案:添加urlencode()命令,如下所示

$fixurl = urlencode('https://gptxsw.appspot.com/view/downloadSubmission?formId=GP_v7[@version=null and     @uiVersion=null]/GP_v7[@key=uuid:d0721391-6953-4d0b-b981-26e38f05d2e5]');
$xdurl= new SimpleXMLElement($fixurl, NULL, TRUE);
$keyname2 = $xdurl->data->GP_v7->SDD_ID_N[0];
echo $keyname2;

这提供了答案(在这种情况下为958)