Это образец XML, возвращенного из API-интерфейса ZoHo CRM. Мне нужно разобрать все данные, чтобы вставить в базу данных. Те записи, которые являются «Родителями», не имеют идентификатора родительской учетной записи или имени родительской учетной записи (см. Примерную строку 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 в образце), затем снова появятся неопределенные ошибки смещения.
Обновлено …, чтобы посмотреть на это с точки зрения 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;
}
Данные не возвращены.
Я знаю, что это старый, но есть параметр, который вы можете отправить, который должен выводить все поля, независимо от того, пустые они или нет, я обычно гарантирую, что передаю:
&newFormat=2&selectColumns=All&version=2
Также я надеюсь, что следующее может кому-то помочь, мне потребовалось некоторое время, чтобы понять, как вернуть данные Zoho в виде простого массива:
public function getCustomerRecordsALL()
{
$token = 'YourTokenHere'; //'$this->token;
$url = "https://crm.zoho.com/crm/private/xml/Accounts/getRecords";
$param= "authtoken=".$token."&scope=crmapi&newFormat=2&selectColumns=All&version=2&toIndex=200&fromIndex=-1&version=2";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
// FIX THIS
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$result = curl_exec($ch);
curl_close($ch);
// First deal with problem with Simple XML and CDATA
$sxo = simplexml_load_string($result, null, LIBXML_NOCDATA);
#$sxo = simplexml_load_string(file_get_contents('testdata.txt'), null, LIBXML_NOCDATA); // TESTING ONLY
$data = ($sxo->xpath('/response/result/Accounts/row'));
//Set the variables you're expecting to capture
$arrVariables = array("Account Name", "Address 1", "Address 2", "Address 3", "Email");
$retArr = NULL;
foreach($data as $row) // Iterate over all the results
{
foreach($arrVariables as $arrVar) // Iterate through the variables we're looking for
{
$rowData = ($row->xpath('FL[@val="'.$arrVar.'"]'));
@$arrReturn[$arrVar] = (string)$rowData[0][0];
}
$retArr[] = $arrReturn;
}
return $retArr;
}
print_r(getCustomerRecordsALL());
Оригинальный постер мог пропустить первые 20 строк или около того и просто загрузить XML из файла.
Других решений пока нет …