«Неустранимая ошибка: невозможно повторно объявить» при повторном использовании кода синтаксического анализа XML - PullRequest
0 голосов
/ 12 августа 2009

У меня есть одна функция синтаксического анализа xml, которую я пытаюсь вызвать несколько раз, так как мне нужно только удалить небольшие данные и продолжить работу.

Вот функция:

//Parse Product ID from Product Sides
function getProductSpecs($xml,$type) {

    // Setup arrary
    global $productspecs;
    global $count;
    $count = 0;
    global $type_check;
    $type_check = $type;

    // Parse the XML
    // Create the parser
    if (! ($xmlparser = xml_parser_create()) )
    { 
     die ("Cannot create name list parser");
    }

    // Start tag function
    function first($parser, $name, $attribs) {
        global $trigger;
        if ($name == "PRODUCTSIDEID") {
            $trigger = 1;
        } elseif ($name == "PRODUCTID") {
            $trigger = 1;
        }
    }

    // data handler function
    function xml($parser, $data) {
        global $trigger;
        global $productspecs;
        global $count;
        global $type_check;
        if ($trigger == 1){
            if ($type_check == "sideid") {
                $productspecs[$count]=$data;
                $count = $count + 1;
            } elseif ($type_check == "productid") {
                $productspecs[$count]=$data;
                $count = $count + 1;
            }               
            $trigger = 0;
        }
    }

    // Call the handler functions
    xml_set_element_handler($xmlparser, "first", "");

    // Call the data handler
    xml_set_character_data_handler($xmlparser, "xml");

    // Parse the XML data
    xml_parse($xmlparser,$xml);
    // Clear parser
    xml_parser_free($xmlparser);

    //Return the array
    return $productspecs;
}

Моя проблема возникает, когда это называется:

xml_set_element_handler($xmlparser, "first", "");

Я получаю сообщение об ошибке:

function first($parser, $name, $attribs) {

Функция появляется только один раз, и я предполагаю, что проблема возникает при вызове, но есть ли способ обойти это, поэтому мне не нужно дублировать столько кода. Я собираюсь повторить это несколько раз.

Спасибо.

1 Ответ

1 голос
/ 12 августа 2009

Определение функций внутри функций может привести к этому. Каждый раз, когда вы запускаете getProductSpecs(), он снова пытается объявить first() и xml(), а в PHP все пользовательские функции объявлены в глобальной области действия . Лучшее решение - переместить вашу функцию first() и вашу функцию xml() за пределы основной функции getProductSpecs().

Другой вариант - использовать function_exists () вокруг объявлений функций, например:

if (! function_exists('first')) {
 // Start tag function
    function first($parser, $name, $attribs) {
        global $trigger;
        if ($name == "PRODUCTSIDEID") {
                $trigger = 1;
        } elseif ($name == "PRODUCTID") {
                $trigger = 1;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...