Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]xml parser
Forum PHP.pl > Forum > Przedszkole
borpaw
Mam problem z xml parser a dokładnie z polskimi znakami.
Wszystko jest niby ok są polskie znaki ale wyrazy które je zawierają są ucinane do pierwszego wystąpienia ogonka.
Czytałem na forum, że to powoduje dwukrotne wywołanie funkcji xml_set_character_data_handler.
Ale nie znalazłem wyjaśnienia co z tym zrobić żeby było dobrze?questionmark.gif
erix
Masz wszędzie jednakowe kodowanie?
borpaw
tak utf8

Robie import z xml i tak to wygląda

  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  2. <?php
  3. $file = 'WMRODZ.xml';
  4. $stack = array();
  5.  
  6. function startTag($parser, $name, $attrs)
  7. {
  8. global $stack;
  9. $tag=array("name"=>$name,"attrs"=>$attrs);
  10. array_push($stack,$tag);
  11.  
  12. }
  13.  
  14. function cdata($parser, $cdata)
  15. {
  16. global $stack,$i;
  17. if(trim($cdata))
  18. {
  19. $stack[count($stack)-1]['cdata']=$cdata;
  20. }
  21. }
  22.  
  23. function endTag($parser, $name)
  24. {
  25. global $stack;
  26. $stack[count($stack)-2]['children'][] = $stack[count($stack)-1];
  27. array_pop($stack);
  28. }
  29.  
  30. $xml_parser = xml_parser_create('UTF-8');
  31. xml_set_element_handler($xml_parser, "startTag", "endTag");
  32. xml_set_character_data_handler($xml_parser, "cdata");
  33.  
  34. xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, TRUE);
  35. xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, TRUE);
  36. xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, "utf-8");
  37.  
  38. $data = xml_parse($xml_parser,file_get_contents($file));
  39. if(!$data) {
  40. die(sprintf("XML error: %s at line %d",
  41. xml_error_string(xml_get_error_code($xml_parser)),
  42. xml_get_current_line_number($xml_parser)));
  43. }
  44.  
  45. xml_parser_free($xml_parser);
  46.  
  47. print("<pre>\n");
  48.  
  49. foreach ($stack[0]['children'][0]['children'] as $key=>$value):
  50.  
  51. $insert = "INSERT INTO slo_WMRODZ VALUES ( ";
  52.  
  53. foreach($value['children'] as $line):
  54. $cdata = $line['cdata'];
  55. $insert .= " '".trim($cdata)."', ";
  56. endforeach;
  57.  
  58. $insert .= " );";
  59.  
  60. echo $insert;
  61. echo "<br>";
  62.  
  63. endforeach;
  64.  
  65.  
  66. print("</pre>\n");
  67. ?>


Plik xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <teryt>
  3. <catalog name="SIMC" type="all" date="2009-01-01">
  4. <row>
  5. <col name="RM">01</col>
  6. <col name="NAZWA_RM">wieś </col>
  7. <col name="STAN_NA">2009-01-01</col>
  8. </row>
  9. <row>
  10. <col name="RM">02</col>
  11. <col name="NAZWA_RM">kolonia </col>
  12. <col name="STAN_NA">2009-01-01</col>
  13. </row>
  14. <row>
  15. <col name="RM">03</col>
  16. <col name="NAZWA_RM">przysiółek </col>
  17. <col name="STAN_NA">2009-01-01</col>
  18. </row>
  19. <row>
  20. <col name="RM">04</col>
  21. <col name="NAZWA_RM">osada </col>
  22. <col name="STAN_NA">2009-01-01</col>
  23. </row>
  24. </catalog>
  25. </teryt>
  26.  


Wynik

  1. INSERT INTO slo_WMRODZ VALUES ( '01', 'ś', '2009-01-01', );
  2. INSERT INTO slo_WMRODZ VALUES ( '02', 'kolonia', '2009-01-01', );
  3. INSERT INTO slo_WMRODZ VALUES ( '03', 'ółek', '2009-01-01', );
  4. INSERT INTO slo_WMRODZ VALUES ( '04', 'osada', '2009-01-01', );


Czy ktoś miał podobny problem?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.