Исходный XML элемент при парсинге делиться на 2 и более

Onore

Новичок
Исходный XML элемент при парсинге делиться на 2 и более

Здравствуйте алл.
Есть маленькая проблемка, все работат, но иногда при разборе большого xml получается
что один элемент 241419 разделятся на два 24 и 1419?
Если меняю длину буфера чтения то разделяется уже другой элемент, подскажите что делать где искать.
Спасибо.
<AUTHOR>
<AUTHOR_ID>24</AUTHOR_ID>
<AUTHOR>//Ошибка нет тега </AUTHOR>
<AUTHOR_ID>1419</AUTHOR_ID>
<AUTHOR_URL>http://www.test.ru/?ID=241419</AUTHOR_URL>
<AUTHOR_NAME>1C:Дистрибьюция</AUTHOR_NAME>
<AUTHOR_DESCRIPTION_TYPE>plain</AUTHOR_DESCRIPTION_TYPE>
<AUTHOR_DESCRIPTION>Продукты издания &quot;1С:Дистрибьюция&quot;
С начала 2004 г. фирма «1С» издает «1С:Дистрибьюция».
</AUTHOR_DESCRIPTION></AUTHOR>

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);
 

Steamroller

Новичок
Ну вот так вот парсер работает.
Как вариант - в обработчике текста (viewData) надо его накапливать в переменную, а выводить и проверять - в обработчике конца элемента.
 

Onore

Новичок
2 Steamroller
Спасибо так и делаю.

А как мне из этого парсера выйти? Тоесть, нужно разбить Бальшой XML на несколько маленьких, для упрощения задачи, я думаю создать несколько Парсеров в отдельных файлах и запускать их по мере необходимости (начало XML, середина XML, конец XML).

Но как мне выйти из первого и передать процес дальше?

Тоесть нужно что-то прописать в

PHP:
function endElement($parser, $tagName)
{ 
...
 //Go to or redirect to xml_parse2.php
}
 

Steamroller

Новичок
Я что-то не вполне понял, что ты хочешь.
Ну в принципе endElement - обычная функция, в которой ты что угодно можешь написать. В частности, создать там парсер, открыть файл и парсить его. Только надо аккуратно, чтобы много раз это не вызвалось.
 

Onore

Новичок
:) хочу перейти например на другой файл
[XML]
<root>
<first ... />
<first ... />
<secont ... />
<secont ... />
</root>
[/XML]

PHP:
function endElement($parser, $tagName)
{
...
if($tagName == 'FIRST')
//Go to or redirect to xml_parse2.php
// переходим к выполнению парсера номер 2 который находится в файле xml_parse2.php
}
 

Steamroller

Новичок
Ну так переходи, напиши там include("xml_parse2.php") - он и выполнится, в чем проблема-то?...
 

Onore

Новичок
2 Steamroller
Написал
1. Но так как функции в этих скриптах имеею одинаковые имена, то получается ошибка.
2. Получается если мне нужно запустить 3 и более xml_parse3... по очереди, то нужно в каждый файл прописывать в

function endElement($parser, $tagName)
{
...
include("xml_parse3.php");
}
 
Сверху