字符间歇性地从PHP构建的XML中消失

时间:2012-03-16 22:54:17

标签: php xml

此循环的XML输出无法验证,但验证器每次都给我不同的错误。每次与开幕时间有关<缺少元素闭包每次都不一样......

xml error 1

xml error 2

每次刷新并重新验证输出时,至少有一个输出,并且它从未出现在同一个成员记录中。

最初我在各处都添加了标签,这就是为什么你会看到很多东西包装不需要它们的地方。

XML是由这个循环构建的:

if ($members) {
  $xml = '<api><response status="ok"><users>';
  foreach ($members as $m) { 

    $join_date = date("Y-m-d H:i:s", $m->join_date);

    list($md) = $mdObj->retrieve("member_id = '$m->member_id'");
    $join_date = ($m->join_date > 0) ? date("Y-m-d H:i:s", $m->join_date) : '0000-00-00 00:00:00';
    $address = preg_replace('/\R/', '', $md->m_field_id_3); 
    $xml .= "<user id=\"$m->member_id\"><admin>0</admin><name><![CDATA[$m->username]]></name><company>$md->m_field_id_9</company><company_id>$md->m_field_id_28</company_id><address><![CDATA[$address]]></address><city>$md->m_field_id_5</city><region>$md->m_field_id_6</region><postal_code>$md->m_field_id_7</postal_code><email><![CDATA[$m->email]]></email><phone>$md->m_field_id_10</phone><first>$md->m_field_id_1</first><last>$md->m_field_id_1 $md->m_field_id_2</last><url></url><description><![CDATA[]]></description><status>active</status><date>$join_date</date><modified>0000-00-00 00:00:00</modified></user>";
  }
  $xml .= '</users></response></api>';
  return $xml;
}

有没有人见过这个?有什么建议吗?

这是一个小PHP信息:

PHP Version 5.2.17

Linux foo.foo.com 2.6.18-274.17.1.el5#1 SMP Wed Jan 4 22:45:44 EST 2012 x86_64

建造日期2012年2月8日14:19:50

3 个答案:

答案 0 :(得分:1)

我怀疑您包含在XML中的数据库条目可能包含具有特殊含义的未转义字符,例如需要编码的&<>"'

我也会将那个长串分解为

$xml .= "<user id=\"" . $m->member_id . "\"><admin>0</admin><name><![CDATA[";
$xml .= $m->username . "]]></name><company>" . $md->m_field_id_9 . "</company>";
$xml .= "<company_id>" . $md->m_field_id_28 . "</company_id><address><![CDATA[";
$xml .= $address . "]]></address><city>" . $md->m_field_id_5 . "</city><region>";
$xml .= $md->m_field_id_6 . "</region><postal_code>" . $md->m_field_id_7;
$xml .= "</postal_code><email><![CDATA[" . $m->email . "]]></email><phone>";
$xml .= $md->m_field_id_10 . "</phone><first>" . $md->m_field_id_1 . "</first>";
$xml .= "<last>" . $md->m_field_id_1 . $md->m_field_id_2 . "</last><url></url>";
$xml .= "<description><![CDATA[]]></description><status>active</status><date>";
$xml .= $join_date . "</date><modified>0000-00-00 00:00:00</modified></user>";

然后使用str_replace()专门编码上述字符。

答案 1 :(得分:0)

可以发生的事情是你的数据包含不可见的空格,最明显的是DEL个字符..我想这会导致这种精确的行为。

要检查,请遍历字符串中的每个字符并打印字符代码以检查字符串是否包含任何隐藏的空格。

答案 2 :(得分:0)

这似乎是Chrome在大型XML文件中的视图源例程中的错误。通过IE和FireFox从相同来源获得的XML在重复测试中是有效的。

此外,Chrome的普通视图未显示这些异常,并且在正常视图中未报告XML中的错误。