2009-08-11 3 views
0

У меня есть одна функция синтаксического анализа xml, которую я пытаюсь вызвать несколько раз, так как мне нужно всего лишь вырезать небольшие данные и продолжить.«Неустранимая ошибка: не удается переопределить» при повторном использовании кода анализа 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

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

Другой вариант заключается в использовании вокруг ваших объявлений функций, например:

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

Спасибо за ответ. Я подумал, что это что-то такое, что я просто не обмотал голову. – techguytom

Смежные вопросы