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>Продукты издания "1С:Дистрибьюция"
С начала 2004 г. фирма «1С» издает «1С:Дистрибьюция».
</AUTHOR_DESCRIPTION></AUTHOR>
Здравствуйте алл.
Есть маленькая проблемка, все работат, но иногда при разборе большого 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>Продукты издания "1С:Дистрибьюция"
С начала 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);