Парсинг XML, в адрибутах очень обольшой текст.

Onore

Новичок
Парсинг XML, в адрибутах очень обольшой текст.

Здравствуйте.

Подскажите как парситься ХМЛ, то есть если много данных внутри ноды то функция viewData запускается множество раз.
А что если в атрибутах передается много данных? И насколько эффективно их там держать?

PHP:
$file = "all_offers.xml";
$depth = array();
$authorId_arr = array();
$fp_table = 1;
$authorTag_arr = array('AUTHOR_URL', 'AUTHOR_NAME', ..., 'AUTHOR_EMAIL');
function startElement($parser, $name, $attrs) 
{
   global $depth, $fp_table, $tagName;
      global $endData;
     $tagName = $name;
     if ($name == "OFFERS") {
     $fp_table = fopen("all_author.txt", "w") or die("Error:" .$fp_table);
     }
     if ($tagName == "OFFERS") @fputs($fp_table, "<AUTHORS>"); // BIGIN AUTHORS
   $depth[$parser]++;
}

function endElement($parser, $tagName) 
{
  global $depth, $fp_table;
     global $authorIsUnic, $authorTag_arr;
  $depth[$parser]--;
    
    if ($tagName == "OFFERS") {
        @fputs($fp_table, "</AUTHORS>"); // END AUTHORS
        fclose($fp_table);
    }
    if($authorIsUnic && in_array($tagName, $authorTag_arr)) @fputs($fp_table, "</" .$tagName. ">");
     if($authorIsUnic && $tagName == "OFFER") @fputs($fp_table, "</AUTHOR>");
}

function viewData($parser, $data) 
{
   global $fp_table;
   global $tagName, $tagNamePrev, $authorId_arr, $authorTag_arr, $authorIsUnic;
  if($tagName == "AUTHOR_ID") {
    if(!in_array($data, $authorId_arr)) {
            $authorIsUnic = true;
      @fputs($fp_table, "<AUTHOR>\r\n");
            @fputs($fp_table, "<" .$tagName. ">" .$data. "</" .$tagName. ">\r\n");
    } else {
            $authorIsUnic = false;
        }
      array_push($authorId_arr, $data);
  }
  
  if($authorIsUnic && in_array($tagName, $authorTag_arr) ) {
      if($tagName != $tagNamePrev)  @fputs($fp_table, "<" .$tagName. ">");
        @fputs($fp_table, $data);
        $tagNamePrev = $tagName;
    }
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_default_handler($xml_parser, "viewData");
if (!($fp = fopen($file, "r"))) {
   die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
   if (!xml_parse($xml_parser, $data, feof($fp))) {
       die(sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));
   }
}
xml_parser_free($xml_parser);
 

Onore

Новичок
Для того, чтобы было понятно что делает viewData.
А где есть не убогий код?
 

Frol

Новичок
функция viewData может запускаться столько раз, сколько она хочет.
тебе надо просто изменить алгоритм.

и теперь вопрос: зачем стоит @ в fputs?
 

Onore

Новичок
@ - не знаю я ее туда не ставил :). @ подавляет возникшую ошибку, но это все ты лучше меня знаешь.

Я спрашивал про startElement с viewData все понятно. Какие ограничения на длину атрибутов?

На длину значения ноды "ограничения" нет, так как viewData -- "может запускаться столько раз, сколько она хочет".
 

Frol

Новичок
я ответил.
не надо пихать в атрибуты из-за того, что viewData может вызываться несколько раз.
надо _сменить_ алгоритм.

итого тебе надо снести это убожество и написать свое, с нуля.
 

Onore

Новичок
ок.
"А что если в атрибутах передается много данных? И насколько эффективно их там держать?"

Много данных в атрибутах эт не моя прихоть, а формата CommerceML
синтаксис: < ЗначениеСвойства
Значение = string
ИдентификаторКаталога = uuid
ИдентификаторСвойства = string
/>
 

ivankrkrkr

Новичок
По моему хранить даные в атрибутах так же эффективно как и в элементах, то есть без разницы.
Это вопрос семмантики данных, раз стандарт предопределил и сказал "атрибут!" , то не надо из-за этого переживать
 

slach

Новичок
по стандарту SAX парсер может запустить событие CharacterData (у тебя на него повешен хандлер viewData) сколько угодно раз

конкатенируй в переменную и сбрасывай \ фиксирую состояние в базу (или какой другой storage) при завершеннии элемента в endElement

2Frol ;) КОД не шибко уж и убогий, обычный SAX парсер
всего лишь чуть чуть измененный пример из мануала ну и global к месту и не к месту понатыканый =)
 
Сверху