Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php/XML] cudzyslow w tresci znacznika XML
Forum PHP.pl > Forum > XML, AJAX > XML
Bartlomiej Dwornik
Witam,
mam nastepujacy problem. Parsuje plik XML (oferta ksiegarni) w php i wszystko gra, dopoki w ktoryms ze znacznikow nie ma cudzyslowu (tutaj w tytule):

Kod
<book nr="42319">
    <tytul>Telewizja i jej gatunki po "Wielkim Bracie"</tytul>
    <autor>Wiesław Godzic</autor>
    <cena>32.00</cena>
</book>


wtedy na stronie php zamiast tytulu pojawia sie tylko cudzyslow i nic wiecej.
probowalem funkcji str_replace, htmlspecialchars, htmlentities, ale nic z tego.

sam parser wyglada tak:

  1. <?php
  2. if(! ($fp = fopen("http://www.lideria.pl/partner/xml/getopisy?pin=xxxxxx&bk1=442","r"))) die ("Nie można otworzyć pliku XML!");
  3. $book_counter = 0;
  4. $book_data = array();
  5. $xml_current_tag_state = '';
  6.  
  7. function startElementHandler($parser, $element_name, $element_attribs)
  8. {
  9. global $book_counter;
  10. global $book_data;
  11. global $xml_current_tag_state;
  12. if($element_name == "BOOK")
  13. {$book_data[$book_counter]["nr"] = $element_attribs["NR"];}
  14. else
  15. {$xml_current_tag_state = $element_name;}
  16. }
  17.  
  18. function endElementHandler($parser, $element_name)
  19. {
  20. global $book_counter;
  21. global $book_data;
  22. global $xml_current_tag_state;
  23. $xml_current_tag_state = '';
  24. if($element_name == "BOOK")
  25. { $book_counter++; }
  26. }
  27.  
  28. function characterDataHandler($parser, $data)
  29. {
  30. global $book_counter;
  31. global $book_data;
  32. global $xml_current_tag_state;
  33. if($xml_current_tag_state == '')
  34. retrurn;
  35. if($xml_current_tag_state == "TYTUL")
  36. { $book_data[$book_counter]["tytul"] = $data; }
  37. if($xml_current_tag_state == "AUTOR")
  38. { $book_data[$book_counter]["autor"] = $data; }
  39. if($xml_current_tag_state == "CENA")
  40. { $book_data[$book_counter]["cena"] = $data; }
  41. }
  42.  
  43. if(!($xml_parser = xml_parser_create())) die ("Nie można utworzyć analizatora XML!");
  44. xml_set_element_handler($xml_parser, "startElementHandler", "endElementHandler");
  45. xml_set_character_data_handler($xml_parser, "characterDataHandler");
  46.  
  47. while($data = fread($fp, 4096))
  48. {
  49. if(!xml_parse($xml_parser, $data, feof($fp)))
  50. { break; }
  51. }
  52.  
  53. xml_parser_free($xml_parser);
  54. ?>


moze jakis dobry czlowiek bedzie w stanie pomoc :-)
Troll
Ale to nie jest poprawny plik XML - wiec nie jest to XML zasadniczo. Musisz zamienić wszystkie cudzysłowy na encje jeżeli chcesz korzystać z XML.

Napisz skrypt, który będzie:
- szukał ="coś" i zostawiał to niezmienione,
- szukał "coś" i zamieniał na &quot; cudzysłowy.

Alternatywnie możesz zamienić zawartość każdego elementu na CDATA -
wtedy powinien on wyglądać mniej więcej tak:
<znacznik>
<![CDATA[ zawartość ]]>
</znacznik>
Bartlomiej Dwornik
plik XML jest poprawny - podalem tylko fragment, ktory sie wysypuje.
tak jak napisalem - str_replace (i pozostale _replace'y tez), htmlspecialchars i htmlentities sie nie sprawdzilo. Handler juz do php-owskiej zmiennej dostaje nieprawidlowa wartosc
Troll
Fakt jest poprawny... Mój błąd...

Możesz spróbować napisać jakiś skrypt powłoki ostatecznie choć to bardzo siermiężne rozwiązanie...
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.