【发布时间】:2015-12-29 03:58:48
【问题描述】:
这是从 ZoHo CRM API 返回的 XML 示例。我需要解析出所有数据以插入数据库。那些属于“父母”的记录没有父帐户 ID 或父帐户名称(参见示例第 2 行)。这会导致未定义的偏移量:这些行出现错误。我不知道为什么......
<?xml version="1.0" encoding="UTF-8" ?>
<response uri="/crm/private/xml/Accounts/getRecords">
<Accounts>
<row no="1">
<FL val="ACCOUNTID">123456789</FL>
<FL val="Account Name"><![CDATA[My Account Center]]></FL>
<FL val="PARENTACCOUNTID">234567891</FL>
<FL val="Parent Account"><![CDATA[Global Corp]]></FL>
<FL val="Shipping State"><![CDATA[IN]]></FL>
<FL val="Account Status"><![CDATA[Active Account]]></FL>
</row>
<row no="2">
<FL val="ACCOUNTID">234567891</FL>
<FL val="Account Name"><![CDATA[Global Corp]]></FL>
<FL val="Shipping State"><![CDATA[IN]]></FL>
<FL val="Account Status"><![CDATA[Active Account]]></FL>
</row>
</Accounts>
</response>
我可以使用 XPATH 访问所有需要的节点:
$accounts = $XML->xpath('/response/result/Accounts/row/FL[@val="ACCOUNTID"]');
$acctName = $XML->xpath('/response/result/Accounts/row/FL[@val="Account Name"]');
$pAcctID = $XML->xpath('/response/result/Accounts/row/FL[@val="PARENTACCOUNTID"]');
$pAcctName = $XML->xpath('/response/result/Accounts/row/FL[@val="Parent Account"]');
$state = $XML->xpath('/response/result/Accounts/row/FL[@val="Shipping State"]');
然后迭代...
for ($i = 0; $i < $itemsTotal; $i++) {
$j = $i + 1;
echo "Counter: " . $i . "<br/>";
echo "Record ID: " . $j . "<br/>";
echo "Account ID: " . $accounts[$i] . "<br/>";
echo "Account Name: " . $acctName[$i] . "<br/>";
echo "Location State: " . $state[$i] . "<br/>";
echo "Parent Account ID: " . $pAcctID[$i] . "<br/>";
echo "Parent Account Name: " . $pAcctName[$i] . "<br/>";
}
我已经尝试在循环中插入这个测试:
if (isset($pAcctID[$i])) {
$pACT = $pAcctID[$i];
$pActName = $pAcctName[$i];
echo "Parent Account ID: $pACT<br/>";
echo "Parent Name: $pActName<br/>";
} else {
echo "Is Parent Account<br/>";
$pACT = "";
$pActName = "";
}
在达到记录 122/157(在示例中显示为第 2 行)之前,这一切正常,然后 Undefined Offset 错误又重新出现。
更新...从 DOMDocument 的角度来看。
$doc = new DOMDocument();
$doc->load('zoho.xml');
$doc->saveXML();
$xpath = new DOMXPath($doc);
foreach($xpath->query("//response/results/Accounts/row") as $data){
echo "Account ID is: " . $xpath->query(".//FL[@val='ACCOUNTID']",$data)->item(0)->nodeValue;
}
没有返回数据。
【问题讨论】:
-
您的
$pAcctID和$pAcctName数组包含的项比其他数组少,并且索引不会与您的其他变量对齐。也许最好像这样获取所有行:$rows = $XML->xpath('/response/result/Accounts/row');,然后遍历$itemsTotal,并且在每次迭代中,使用行中的相对 xpath 查询来获取帐户 ID、名称、父级和状态等。 -
谢谢,基思!我已经编辑了原件以更新我的发现。
-
在您发布的 XML 中,
Accounts是response的子代,但是在您的 xpath 中,您正在搜索results子代,也许这就是为什么没有返回数据的原因? -
如果您将
foreach查询中的表达式更改为$xpath->query("//response/Accounts/row") as $data,那么它看起来应该可以工作:)