XML -> HTML

database

Guest
XML -> HTML

Есть в налии код:
PHP:
    $xml = "";
    $file = 'format.php';
    $currentTag = "";
    $currentAttribs = "";
    function startElement($perser, $name, $attribs)
    {
         global $currentTag;
         $currentTag = $name;
         switch($name)
         {
            case "Listings":
             print "<p>BEGIN</p>";
            break;
         }
    }

    function endElement ($perser, $name)
    {
       global $currentTag;
       switch ($name)
       {
          case "Listings":
             print "<p>END</p>";
          break;
       }
       $currentTag = "";
    }

    function getData ($parser, $data)
    {
       global $currentTag, $xml;


       switch($currentTag)
       {
          case "URI":
          $xml['link'][] =  trim($data);
          break;
          case "URL":
          $xml['title'][] = $data;
          break;

          case "Description":
          $xml['description'][] = trim($data);
          break;
       }

    }
    $xmlPerser = xml_parser_create();
    $caseFold = xml_parser_get_option($xmlPerser, XML_OPTION_CASE_FOLDING);
    $targetEncoding = xml_parser_get_option($xmlPerser, XML_OPTION_TARGET_ENCODING);

    if ($caseFold == 1)
    {
       xml_parser_set_option($xmlPerser, XML_OPTION_CASE_FOLDING, false);
    }
    xml_parser_set_option($xmlPerser, XML_OPTION_SKIP_WHITE, 1);
    xml_set_element_handler($xmlPerser, 'startElement', 'endElement');
    xml_set_character_data_handler($xmlPerser, 'getData');
    $fp = fopen($file, "r");
    while ($data = fread($fp, 4096))
    {
        xml_parse($xmlPerser, $data);
        xml_parser_free($xmlPerser);
    }
    xml_parser_free($xmlPerser);
Код взят из примера.

Имется xml:
PHP:
<Listing>  
<1>bla</2>  
<URL>blablabla</URL>  
<2>bla</2>  
</Listing>
Скрипт выводит данные, но не так, то есть если поле URL, или другой слишком длинное то, он его разбивает..... :
string(0) ""
[6]=>
string(91) "sfspsyavansvafahsfsysxaxadsvapamaxaxsxskssaosysxsvaiafsdamshsosaspsosxavadafsyahspsnsyaxssa"
[7]=>
string(0) ""
[8]=>
string(91) "kafsyspadsxsnanasaasfsvszsiananhhshhasossaaahshskahaaspsnamaoansczaayzfassxskamafapaasfhmav"
[9]=>
string(0) ""
[10]=>
string(91) "hoavshafsfsfsmssacakshzaanzfspsisdsssaaaavsvhmspazzpsmsvazzpszahhzsyspsihvspafaxsyaxaihfaos"
Как с этим бороться? Или это не из-за длины поля?


ЗЫ: ногами не пинайте :) Искал, но ничего подходящего не нашал :(
 

slach

Новичок
запоминать что именно обрабатываешь в глобальной переменной
а потом делать конкатенацию значения...

когда вызывать событие это дело XML парсера
по стандарту SAX он не обязан генерировать событие только один раз...
 

database

Guest
PHP:
$currentTag
как раз это и делает, или я не прав?


slach, можно как - нибудь по подробней? Не особо я понял......

Может документация есть хорошая на русском языке? :)
 

slach

Новичок
$xml['link'][] = trim($data);
меняем на
$xml['link'][$current_link_id] .= trim($data);

еще раз... у тебя несколько раз подряд вызывается событие CDATA ... уж так expat построен

документации на русском нет
попробуй поискать в сети подробную документацию по expat возможно там найдешь ответ как обходить
 

database

Guest
slach, спасибо. Я нашел другой способ решния, полностью рабочий:


PHP:
    $xmlParse = xml_parser_create();
    xml_parser_set_option($xmlParse, XML_OPTION_CASE_FOLDING, false);
    xml_parse_into_struct($xmlParse, $data, $values);
    xml_parser_free($xmlParse);
    foreach ($values as $xml_input)
    {
       if ($xml_input['tag'] == '1') $xml['1'][] = $xml_input['value'];
       if ($xml_input['tag'] == '2') $xml['2'][] = $xml_input['value'];
       if ($xml_input['tag'] == '3') $xml['3'][] = $xml_input['value'];
    }
Все работает.
 

slach

Новичок
ну для некотрых случаев xml_parse_into_struct слишком много памяти жрет...
 
Сверху