Как мне передать следующий foreach в синтаксическом анализе XML с PHP, если поле не существует? - PullRequest
1 голос
/ 18 июля 2009

Я анализирую опубликованный зашифрованный и опубликованный файл XML, отправленный на мой сайт с другого сервера.

В настоящее время сортировка XML (расшифрована) выглядит так:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<transactions>
<transaction>
    <id>407145</id>
    <store_id>4067</store_id>
    <custom_fields>
        <custom_field>
            <custom_field_name>affiliateID</custom_field_name>
            <custom_field_value>25</custom_field_value>
        </custom_field>
        </custom_fields>
</transaction>
</transactions>   

А парсер выглядит так:

$XMLData = rc4crypt::decrypt($key, urldecode($_POST["XMLData"]));
$data = new XMLParser($FoxyData);   // Parse that XML.
$data->Parse();

// go through each of the nodes
foreach ($data->document->transactions[0]->transaction as $tx) {

    $id = $tx->id[0]->tagData;
    $store_id = $tx->id[0]->tagData;

    // get the affiliateID
    foreach ($tx->custom_fields[0]->custom_field as $field) {
    $affiliateID = $field->custom_field_value[0]->tagData;
}



}

Вышеуказанное работает , если только в XML, отправляемом на наш сервер, отсутствуют узлы custom_fields. Затем выдает ошибку «Неопределенное свойство: XMLTag :: $ custom_field».

Так как я хак, я думал, что что-то вроде следующего будет работать, но это не так:

if($tx->custom_fields[0]->custom_field) {

   foreach ($tx->custom_fields[0]->custom_field as $field) {
    $affiliateID = $field->custom_field_value[0]->tagData;
}

}

Это кажется мне логичным, но что не так с моей логикой? Как я могу сказать моему сценарию не выполнять foreach, если этот узел не существует в xml?

Ответы [ 2 ]

2 голосов
/ 18 июля 2009

Сначала вы должны проверить существование $ tx-> custom_fields и $ tx-> custom_fields [0], а затем использовать его дальше.

1 голос
/ 18 июля 2009

Я думаю isset () , вероятно, то, что вы ищете:

if (isset($tx->custom_fields[0]->custom_field)) {
    foreach ($tx->custom_fields[0]->custom_field as $field) {
        $affiliateID = $field->custom_field_value[0]->tagData;
    }
}

Обратите внимание, что нет необходимости проверять $tx->custom_fields, тогда $tx->custom_fields[0], отдельно, использование isset () на самом глубоком уровне вернет false (в противоположность возникновению ошибки), даже если $tx->custom_fields не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...