XML Parsing chardata split

dunno

Новичок
XML Parsing chardata split

Генерируется XML фаил в кодировке cp1257 не мной.
Я его парсирую для ввода в базу в utf8, но "символные данные"(chardata) без причины дробятся(не все!). В итоге получается каша. Есть подозрение, что это как-то связано с кодировками. Долго с этим парюсь, немогу разобраться.
Вообщем код парсера:

PHP:
function elstart ($parser, $name, $attribs) {
        $GLOBALS['tag'] = $name;
}
function chardata ($parser, $data) {
    	if ($GLOBALS['tag'] == 'NAME') {
            echo $GLOBALS['tag'].' : '.$data.'<br>';   }
        elseif ($GLOBALS['tag'] == 'VALUE') {
        	echo $GLOBALS['tag'].' : '.$data.'<br>';   }

}
    $xmlfile = 'xmlfile.xml';
    $p = xml_parser_create();
    mysql_query('SET NAMES utf8');
    xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, true);
    xml_set_element_handler($p, 'elstart', 'elend');
    xml_set_character_data_handler($p, 'chardata');
    $gnt = fopen($xmlfile, 'r');
    while (!feof($gnt)) {
        $buf = fgets($gnt);
        echo "<table border=\"1\"><tr><td>".nl2br(htmlspecialchars($buf))."</td></tr></table>";
        xml_parse($p, $buf);
    };
    echo '<br><br><a href="'.$xmlfile.'">CHECK XMLFILE</a>';
Сам xmlfile.xml (encoding cp1257):


<?xml version="1.0" encoding="Windows-1257" ?>
<ProductSpecification>
<Property>
<Name>PRIM&#256;R&#256; VALSTS</Name>
<Value>Universal</Value>
</Property>
<Property>
<Name>GRUPA</Name>
<Value>GARANTIJAS PAPLA&#352;IN&#256;JUMS</Value>
</Property>
<Property>
<Name>GRUPA</Name>
<Value>GARANTIJAS PAPLA&#352;IN&#256;JUMS</Value>
</Property>
<Property>
<Name>INSTRUKCIJA VALSTS VALOD&#256;</Name>
<Value>N&#274;</Value>
</Property>
<Property>
<Name>MAR&#310;&#274;TA PRECE</Name>
<Value>N&#274;</Value>
</Property>
</ProductSpecification>


Результат парсера:

NAME : PRIM
NAME : &#256;R&#256; VALSTS
VALUE : Universal
NAME : GRUPA
VALUE : GARANTIJAS PAPLA
VALUE : &#352;IN&#256;JUMS
NAME : GRUPA
VALUE : GARANTIJAS PAPLA
VALUE : &#352;IN&#256;JUMS
NAME : INSTRUKCIJA VALSTS VALOD
NAME : &#256;
VALUE : N
VALUE : &#274;
NAME : MAR
NAME : &#310;&#274;TA PRECE
VALUE : N
VALUE : &#274;


за ранее спасибо.
 

olpa

Новичок
По спецификации, SAX-парсер имеет полное право так делать. Надо переписать код с учётом этой фичи.
 

dunno

Новичок
Ну а причино-то какая? Я раньше всегда все парсил и он ничего не разбивал. Вообще тут немного проблематично определить самому когда будет разбивать и на сколько, потому как он иногда одну строку на 3 разбивает.

спасибо за ссылки. Но, как я понял, он получает только первые 1024 символа строки, но у меня в помине нету даже 100 символов в одной строке.

немного подправил код, используя end_element_handler, вроде все как надо.
 
Сверху