Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php/XML] cudzyslow w tresci znacznika XML, jak sie go pozbyc albo zmienic na encje?
Bartlomiej Dworn...
post 30.01.2006, 17:04:42
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.01.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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 :-)


--------------------
Go to the top of the page
+Quote Post
Troll
post 1.02.2006, 17:58:29
Post #2





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 25.07.2005

Ostrzeżenie: (0%)
-----


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>

Ten post edytował Troll 1.02.2006, 18:15:36
Go to the top of the page
+Quote Post
Bartlomiej Dworn...
post 1.02.2006, 18:12:46
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 16.01.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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

Ten post edytował Bartlomiej Dwornik 1.02.2006, 18:14:44


--------------------
Go to the top of the page
+Quote Post
Troll
post 1.02.2006, 18:52:52
Post #4





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 25.07.2005

Ostrzeżenie: (0%)
-----


Fakt jest poprawny... Mój błąd...

Możesz spróbować napisać jakiś skrypt powłoki ostatecznie choć to bardzo siermiężne rozwiązanie...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.05.2025 - 23:38