Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> SimpleXML, DOM xml, zostawia dziury po usunięciu plików
shpaque
post
Post #1





Grupa: Zarejestrowani
Postów: 651
Pomógł: 3
Dołączył: 31.01.2011
Skąd: Warszawa

Ostrzeżenie: (10%)
X----


Witam serdecznie,
nie mogę ogarnąć dość może kontrowersyjnej dla niektórych rzeczy, mianowicie normalnie i w innych przypadkach usuwając klucze z pliku xml funkcją poniżej, przy usunięciu ostatniej ladnie mi "biutifuje" plik, natomiast przy usuwaniu plików (i informacji o plikach w xml) zostawia dziury po usuniętych nodach:

  1. // Funkcja do upiększania formatu xml po jego zapisaniu
  2. function formatXml($simpleXMLElement) {
  3. $xmlDocument = new DOMDocument('1.0', 'utf-8');
  4. $xmlDocument -> preserveWhiteSpace = false;
  5. $xmlDocument -> formatOutput = true;
  6. $xmlDocument -> loadXML($simpleXMLElement -> asXML());
  7. return $xmlDocument -> saveXML();
  8. }


a tu cala klamerka

  1. // W tym kroku sprawdźmy, czy nie należy usunąć jakichś plików
  2. if (isset($postPage['files'])) {
  3. $postFiles = $postPage['files'];
  4. foreach ($postFiles as $key => $f) {
  5. $found = $loadPageDataBase -> xpath('files/file[@id = "'.$key.'"]'); // Szukamy w bazie danych klucza o tym atrybucie ID
  6. if (count($found) == 1) {
  7. if (isset($f['delete']) && $f['delete'] === (string)$found[0]['id']) {
  8. $fileToDelete = './db/upload/'.$found[0][0];
  9. if (file_exists($fileToDelete)) {
  10. // Usuwamy pozycję w bazie danych
  11. $dom = dom_import_simplexml($found[0]);
  12. $dom -> parentNode -> removeChild($dom);
  13. // Oraz usuwamy sam plik
  14. unlink($fileToDelete);
  15. }
  16. else {
  17. echo "<script>window.location.href='./admin.php?page=pages&edit=".$postPage['id']."&danger=Nie odnaleziono pliku ".$found[0][0]."!'</script>";
  18. }
  19. }
  20. else {
  21. // Aktualizujemy nazwy plików
  22. $found[0]['title'] = $postFiles[$key]['title'];
  23. }
  24. }
  25. else {
  26. echo "<script>window.location.href='./admin.php?page=pages&edit=".$postPage['id']."&danger=Nie odnaleziono pliku o id ".$key." w bazie danych!'</script>";
  27. }
  28. }
  29. }
  30.  
  31. // W tym kroku sprawdźmy, czy nie należy dodać jakichś plików
  32. ...
  33.  
  34.  
  35. $loadPageDataBase -> asXML($pathToPageToUpdate);
  36. // Układamy bazę na nowo (biutifujemy)
  37. $beautifyXML = htmlspecialchars(formatXml($loadPageDataBase));
  38. $beautifyXML = html_entity_decode($beautifyXML);
  39. $beautyFile = fopen($pathToPageToUpdate, 'w');
  40. flock($beautyFile, LOCK_EX);
  41. fwrite($beautyFile, $beautifyXML);
  42. flock($beautyFile, LOCK_UN);
  43. fclose($beautyFile);


generalnie cały problem polega na tym, że kiedy zostaja usuniete wszystkie pliki robi sie dziura:
- przyklad pierwszy - mam 5 plikow - usune 4 z nich, wszystko jest ok, jak usune ostatni (piaty) robi sie dziura jako jeden wiersze w pliku xml.
- przyklad drugi - mam 5 plikow, usune wszystkie 5 - robi sie dziurna na 5 wierszy w pliku xml (chyba ze w miedzyczasie dodam jakies pliki - to wypelnia ta dziure, np dodam 3 pliki, zostanie dziura na 2 wiersze...

@EDIT
Podejrzewam - mam pewność że chodzi o tą funkcję - znalazłem w necie, że jedni mówią żeby preservewhitespace było na false, inni true - generalnie nei ma to znaczenia bo zawsze przy usunieciu wszystkich dzieci konkretnego klucza zostają jakieś "\n" i stad nie zmienia się na "<rodzic/>" tylko zostaje "<rodzic </rodzic>" i TYLKO w przypadku usunięcia wszystkich choldren, czyli pozostawienia pustego rodzica...

Ten post edytował shpaque 12.01.2021, 14:25:04
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 2.10.2025 - 19:39