Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: XML z niedozwolonymi znakami typu &
Forum PHP.pl > Forum > XML, AJAX > XML
TomaszPawel
Witajcie!

Mam taki XML:

  1. <users>
  2. <id>103</id>
  3. <name>STE\/E</name>
  4. <teamid>189</teamid>
  5. <team>SETI.USA</team>
  6. <challenge_credit>9000570</challenge_credit>
  7. </user>
  8. <user>
  9. <id>59181</id>
  10. <name>Ross*</name>
  11. <teamid>1596</teamid>
  12. <team>Sicituradastra.</team>
  13. <challenge_credit>6998196</challenge_credit>
  14. </user>
  15. <user>
  16. <id>47984</id>
  17. <name>Firas Masri</name>
  18. <teamid>2146</teamid>
  19. <team>Hayrabedian & Associates</team>
  20. <challenge_credit>461827</challenge_credit>
  21. </user>
  22. </users>


Gdy próbuję go wczytać za pomocą XMLReader przy pomocy takiego kodu:

  1. $reader = new XMLReader();
  2.  
  3. //sciezka
  4. $reader->open('../../tpstat/projekty/PrimeGridW/'.$dzisiaj.'/challenge_users.xml');
  5.  
  6. $count=0;
  7.  
  8. while($reader->read())
  9. {
  10. if($reader->nodeType == XMLReader::ELEMENT)
  11. {
  12. $name = $reader->name;
  13.  
  14. if ($reader->name == 'user')
  15. {
  16. $notes[$count] = array();
  17. }
  18. }
  19.  
  20. if($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA)
  21. {
  22. $notes[$count][$name] = trim($reader->value);
  23. }
  24.  
  25. if($reader->nodeType == XMLReader::END_ELEMENT)
  26. {
  27. if ($reader->name == 'user')
  28. {
  29. $count++;
  30. }
  31. }
  32. }


oczywiście po dojściu do znaku & wywala mi się.

Wypisując błędy:

  1. Warning: XMLReader::read() [xmlreader.read]: file:///F:/xampp/htdocs/tpstat/projekty/PrimeGridW/20111220/challenge_users.xml:1274: parser error : xmlParseEntityRef: no name in F:\xampp\htdocs\tpstat\skryptypobierajacew\PrimeGrid.php on line 55
  2.  
  3. Warning: XMLReader::read() [xmlreader.read]: <team>Hayrabedian & Associates</team> in F:\xampp\htdocs\tpstat\skryptypobierajacew\PrimeGrid.php on line 55
  4.  
  5. Warning: XMLReader::read() [xmlreader.read]: ^ in F:\xampp\htdocs\tpstat\skryptypobierajacew\PrimeGrid.php on line 55
  6.  
  7. Warning: XMLReader::read() [xmlreader.read]: An Error Occured while reading in F:\xampp\htdocs\tpstat\skryptypobierajacew\PrimeGrid.php on line 55


linia 55 w kodzie to
  1. while($reader->read())

a linia 1274 to
  1. <team>Hayrabedian & Associates</team>


Od dwóch dni próbuję sobie z tym poradzić i nie mogę... Nie mam wpływu na to, że w XMLu zamiast
  1. &amp
jest
  1. &
.

W jaki sposób sobie z tym poradzić. Gdy ręcznie podmieniłem
  1. &
na
  1. &amp
wszystko ziała jak talala... tylko, że ręczna zabawa odpada, bo pliczek XML ma być importowany automatycznie z serwera co 15 minut...

W jaki sposób "podmienić"
  1. &
na
  1. &amp
w ciągu
  1. Hayrabedian & Associates
tak aby XMLReader się nie wysypywał. To samo dotyczy innych zabronionych znaków wymienionych tutaj link.

No i jak postąpić gdy dajmy na to część znaków w pliku jest poprawnie zamieniona na
  1. &amp
, żeby po podmianie nie wyszło nam
  1. &amp;&amp;
  2. albo
  3. &amp;amp;


Programistą nie jestem, a bawię się w php dla frajdy...

Do tej pory wyprodukowałem coś takiego:

http://boinc.pl/stats

A omawiany problem, powstrzymuje mnie przed dodaniem statystyk wyścigowych...
melkorm
A nie masz wpływu na generowany plik XML ?
qrooel
Znaki specjalne i encje powinieneś umieścić w CDATA przy generowaniu takiego dokumentu.

http://www.w3schools.com/xml/xml_cdata.asp

edit: nie doczytałem, że nie możesz zmieniać tego.
nospor
Przecież napisał, że nie ma wpływu na xml....

użyj str_replace i po sprawie
Cytat
No i jak postąpić gdy dajmy na to część znaków w pliku jest poprawnie zamieniona na
[XML] pobierz, plaintext
&amp
, żeby po podmianie nie wyszło nam
[XML] pobierz, plaintext
&amp;&amp;
albo
&amp;amp;

To też użyj str_replace, tylko najpierw jedno str_replace, które zamienie &nbsp; na &
a potem już to prawidłowe str_replace, gdzie bedziesz zamieniał niedozwolone znaki na encje.
TomaszPawel
A konkretnie to jakbyś to zaimplementował?
nospor
Za bardzo nie ma tu co implementować, tylko normalnie po ludzku użyć
http://pl.php.net/manual/en/function.str-replace.php
zegarek84
po testuj to - wygląda, że działa a nie mam czasu bawić się:
Kod
$text = 'daf a& &asd;ŕ&11 co &';
$pattern = '/(?!&#[0-9]+;|&[a-z]+;)&/';
$replace = '&';
echo preg_replace($pattern, $replace, $text);

code gdyż przy php zastępuje symbolem specjalnym jak wpisuję w styl "& # 1343;" - bez spacji - ale w code też widzę lipa ;p
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.