【问题标题】:parse special character xml file using simplexml使用 simplexml 解析特殊字符 xml 文件
【发布时间】:2012-09-30 11:02:10
【问题描述】:

抱歉,如果有一个明显的答案(我知道有大约 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;

这提供了空值。如果我尝试类似 回声 $xdurl->asXML(); 我从网站(不是来自 PHP)收到错误响应。

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

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

【问题讨论】:

  • 你不能使用simplexml_load_file()有什么原因吗?
  • 尝试等效的加载命令会产生相同的错误 - 它会加载第一个示例,但会失败第二个示例(标题中有或没有空格)

标签: php xml parsing simplexml special-characters


【解决方案1】:

我们开始: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 请求结果的本地副本来调试它,它运行良好。)

【讨论】:

  • 我认为你正在做一些事情:我可以让本地版本工作,但你拥有的版本仍然没有 - 我收到类似于 [link]stackoverflow.com/questions/2410031/… 的消息。请注意,人员的请求也有一个带有非标准字符的 URL。我必须假设(因为我对完全相同的站点的第一次请求有效)问题是 [ ] @ ?或类似的。
【解决方案2】:

感谢@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)

【讨论】:

  • 这很有趣,因为我最初提供的解决方案使用未转义的 URL 没有进一步的手动编码在我的本地机器上为我工作 - 所以我认为我的 PHP/SimleXMLElement 版本处理它的方式与你的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
相关资源
最近更新 更多