Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php, xml] Jak dodać element do pliku xml
Forum PHP.pl > Forum > XML, AJAX > XML
ceieneka
Witam
Na wstępie chciałbym napisać że to mój pierwszy dzień z xml-em więc jestem zielony.

Mam prosty pliczek xml i chciałbym do niego dopisać element, siedzę w manualu php od godziny patrze na klasy xmlWriter, xmlReader, simpleXML ale nie mogę znaleźć przykładu dopisywania elementów do pliku xml wszędzie tylko pobieranie danych. Jaką funkcją można najprościej dopisać element do xml-a?
230005
No jak w XMLWriter nie ma opisu jak dodawać elementy?? biggrin.gif Zainteresuj się tym: http://pl.php.net/manual/en/function.xmlwr...ite-element.php albo skorzystaj z DOMDocument, DOMXpath, jeśli chcesz w łatwy sposób wyszukiwać elementy za którymi, bądź przed którymi będzie dodawany nowy element.
ceieneka
No ok ale gdzie w tym przykładzie w komentarzu jest otwierany istniejący już plik xml tam jest użyte xmlwriter_open_memory(), a według manuala ta funkcja nie przyjmuje żadnych argumentów więc skąd ma wiedzieć do jakiego xml-a dopisywać no i która linia zapisuje zmodyfikowany plik ?
230005
Pewnie outputMemory(), w końcu przy niej stoi jak byk: returns current buffer. Czyli robisz miks file_put_contents i tej właśnie metody. Wczytujesz cały plik natomiast XMLReaderem, np. do tablicy. Jak znasz php i potrafisz myśleć, to nic więcej ci nie jest potrzebne smile.gif. Jednak jak dla mnie to za dużo kombinacji. DOMDocument razem z DOMXpath tworzą przepotężny i wszechwygodny tandem, a nazwy funkcji i ich opisy są tak jasne jak to tylko możliwe.
ceieneka
OK
Sam sobie nie poradzę na początku, masz może link do jakiegoś łatwego tutoriala. PHP znam "dobrze" ale obsługi xml-a dopiero chcę się nauczyć.
Podam może co chcę zrobić. Mam takiego xml-a zapisanego jako galeries.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <package>
  4. <galeria>
  5. <galName>czarno-białe</galName>
  6. <galImage>images/1.jpg</galImage>
  7. </galeria>
  8. <galeria>
  9. <galName>opium art and fashion</galName>
  10. <galImage>images/2.jpg</galImage>
  11. </galeria>
  12. <galeria>
  13. <galName>różne</galName>
  14. <galImage>images/7.jpg</galImage>
  15. </galeria>
  16. <galeria>
  17. <galName>czarno-białe</galName>
  18. <galImage>images/1.jpg</galImage>
  19. </galeria>
  20. <galeria>
  21. <galName>opium art and fashion</galName>
  22. <galImage>images/2.jpg</galImage>
  23. </galeria>
  24. <galeria>
  25. <galName>różne</galName>
  26. <galImage>images/7.jpg</galImage>
  27. </galeria>
  28. </package>


i teraz chcę dodać nową galerię powiedzmy taką:
  1. <galeria>
  2. <galName>nowa</galName>
  3. <galImage>images/xxx.jpg</galImage>
  4. </galeria>


Jak można to najprościej zrobić?

Przyjrzałem się klasie DOMDocument rzeczywiście jest lepiej opisana ale umiem dodawać elementy jako elementy główne bez dodawania w hierarchii. sad.gif
230005
To spójrz jeszcze tu: http://pl.php.net/manual/pl/domnode.appendchild.php . Wyciągasz tylko roota, czyli w tym wypadku <package />, tworzysz nowy element za pomocą DOMDocument->createElement('nowy') i wypełniasz go tak jak to manual przykazał, albo tak jak chcesz winksmiley.jpg. Potem używasz DOMNode->appendChild() do dodania. Przy pracy z tymi klasami na prawdę nie potrzeba wielkiej filozofii, pobaw się a jestem przekonany, że po chwili będzie tworzył i edytował takie xml'e o jakich się w3 nie śniło winksmiley.jpg.
ceieneka
Jestem początkujący :/
Co to znaczy wyciągasz roota czyli package? tzn. chyba wiem o co Ci chodzi tylko jak to zrobić znaczy jak go wyciągnąć napisz mi tylko kod jak dodać nowy element do elementu package, wczytywanie i zapisywanie ogarniam - plizzz bo kombinuje już z różnymi klasami i zawsze czegoś brak ... sciana.gif

na przykład robię tak (pochwale się co umię smile.gif):
  1. <?php
  2. $dom = new DOMDocument();
  3. $dom->load('galeries.xml');
  4. $element = $dom->createElement('test', 'element testowy');
  5. $dom->appendChild($element);
  6. $dom->save('galeries2.xml');
  7. ?>


wszystko pięknie ale element nie jest dodawany do package, tak jak chcę. A jak robię tak:
  1. ...
  2. $element = $dom->package->createElement('test', 'element testowy');
  3. $dom->appendChild($element);
  4. $dom->save('galeries2.xml');

to wywala błędy sad.gif
230005
  1.  
  2. $dom = new DOMDocument();
  3. $dom->load('gallery.xml');
  4. $element = $dom->createElement('test', 'element testowy');
  5. $dom->documentElement->appendChild($element);
  6. $dom->save('galeries2.xml');
  7.  


Uprzedzę Twoje pytania - jak chcesz dodać w elemencie test kolejne dziecko, to robisz mniej więcej tak (nie sprawdzałem, ale powinno grać )):

  1.  
  2. $dom->documentElement->lastChild->appendChild($dom->createElement('nowy' ,'asdf'));
  3.  
ceieneka
O dzięki bardzo, o to chodziło. Sorki że zginąłem na dwa dni...
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.