PHP / CakePHP返回格式错误的XML

时间:2012-01-30 14:39:16

标签: php xml cakephp google-checkout

基本上我正在尝试使用Google Checkout PHP示例代码将Google Checkout订单处理(2级集成)添加到CakePHP应用中。

我可以成功创建购物车并接收从Google发送到我的应用的通知,但不能正确承认这些。

google的代码中执行此操作的函数就是:

<?xml version="1.0" encoding="UTF-8" ?><notification-acknowledgment xmlns="http://checkout.google.com/schema/2" serial-number="119963104284921-00001-7" />

但Google Checkout会收到如下代码:

<?xml version=1.0 encoding=UTF-8 ?><notification-acknowledgment xmlns="http://checkout.google.com/schema/2" serial-number=119963104284921-00001-7 />

我无法解决导致这种情况的原因,我不认为它与Cake有任何关系,我已禁用PHP短标记,因此我可以使用内联XML,但这没有任何区别。

如果我从字符串中删除第一个<,则函数echo正确地执行其余代码,将其保留并且它会刹车(显然这也适用于?并关闭{{1我也不能同时拥有所有这些!)。

我自己可以复制此内容,尝试使用以下功能删除Google代码中所做的任何看不见的内容。它完全相同,但包含在(Cake)控制器中并对变量进行硬编码。

>

public function blank($tags = null) { $schema = 'http://checkout.google.com/schema/2'; $serial = '119963104284921-00001-7'; if ($tags != null) { $acknowledgment = '<?xml version="1.0" encoding="UTF-8" ?'.'>'.'<notification-acknowledgment xmlns="'.$schema.' '.'serial-number="'.$serial.'" />'; } else { $acknowledgment = '?xml version="1.0" encoding="UTF-8" ?>'.'<notification-acknowledgment xmlns="'.$schema.' '.'serial-number="'.$serial.'" />'; } $this->set('_ack', $acknowledgment); } 语句用于显示IF符号的差异。

没有任何内容( $ tags == null )调用它会产生以下结果:

<

Source

使用任何其他值( $ tags!= null )调用它会得到此输出:

<?xml version="1.0" encoding="UTF-8" ?><notification-acknowledgment xmlns="http://checkout.google.com/schema/2" serial-number="119963104284921-00001-7" />

Source

我的问题(终于!)是,为什么会发生这种情况?如何才能正确输出XML?

很抱歉,如果我错过了一些非常明显的东西,但是我宁愿在这里指出它,而不是在另一天无处可去!

3 个答案:

答案 0 :(得分:0)

这个“问题”与PHP解释器有关。

有一些解决方案,但View中的所有内容都不在Controlled中。

//var
$questionmark = "?";
echo "<".$questionmark."xml version=\"1.0\" encoding=\"utf-8\"".$questionmark.">";
// separate
echo '<' . '?xml version="1.0" encoding="utf-8"?' . '>';

答案 1 :(得分:0)

您忘记关闭xmlns属性上的引号,这可能是原因。试试这个:

$acknowledgment = '<?xml version="1.0" encoding="UTF-8" ?'.'>'.'<notification-acknowledgment xmlns="'.$schema.'" '.'serial-number="'.$serial.'" />';

答案 2 :(得分:0)

某些XML解析器不允许以大写字母指定编码(例如,UTF-8不正确)。

尝试将编码更改为“utf-8”以查看是否修复了它。