Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dodawania i edycja XML
Forum PHP.pl > Forum > PHP
Largo
Witam,

Stanąłem na pewny problemie dotyczącym XML. Oto jego struktura:

  1. <?xml version='1.0' standalone='yes'?>
  2. <portfolio>
  3. <produkt>
  4. <project id='1'>
  5. <name>chlodnicze</name>
  6. <title>Urządzenia chłodnicze </title>
  7. <meta_keywords>regał chłodniczy, scorpion</meta_keywords>
  8. <meta_description>Wzornictwo przemysłowe - Urządzenia chłodnicze dla ES SYSTEM K - RCS Scorpion 03, Tucana</meta_description>
  9. </project>
  10. </produkt>
  11. <wnetrza>
  12. <project id='1'>
  13. <name>Blachdom</name>
  14. <title>Budynek biurowo - handlowy </title>
  15. <meta_keywords>Projektowanie wnętrz biurowych, Blachdom 2</meta_keywords>
  16. <meta_description>meta description</meta_description>
  17. </project>
  18. </wnetrza>
  19. </portfolio>


Co jest trudne? Muszę dodawać i edytować rekordy w odpowiednich gałęziach, tj. produkty i wnętrza, a na końcu tych kategorii dodawać nowe dane lub aktualizować te obecne. I za cholerę nie wiem jak do tego podejść. Jak mam sprawdzać weżły rodziców i na końcu dodawać?
darko
http://php.net/manual/en/book.simplexml.php
simplexml_load_file
addChild
Largo
Witaj,

Teoretycznie próbowałem, ale chyba nie za dobrze. Oto próby:

  1. /* Get last ID */
  2. if( !$this->iLastID )
  3. {
  4. $this->getLastID();
  5. }
  6.  
  7. $iLastID = $this->iLastID + 1;
  8.  
  9. /* Create XML Array */
  10. $sXMLToSave = <<<XML
  11.   <project id='{$iLastID}'>
  12.   <name>{$aToSave['sProjectName']}</name>
  13.   <title>{$aToSave['sProjectTitle']}</title>
  14.   <meta_keywords>{$aToSave['sMetaKeywords']}</meta_keywords>
  15.   <meta_description>{$aToSave['sMetaDescription']}</meta_description>
  16.   </project>
  17. XML;
  18.  
  19. /* Find last element in specific group */
  20. /*$this->oXMLHandler->addAttribute( 'id', $iLastID );
  21.  
  22.   $sProject = $this->oXMLHandler->addChild( 'project' );
  23.   $sProject->addChild( 'name', $aToSave['sProjectName'] );
  24.   $sProject->addChild( 'name', $aToSave['sProjectTitle'] );
  25.   $sProject->addChild( 'name', $aToSave['sMetaKeywords'] );
  26.   $sProject->addChild( 'name', $aToSave['sMetaDescription'] );*/
  27.  
  28. echo $this->oXMLHandler->asXML();


I żebyś dobrze zrozumiał - ten kod z XML to nowy projekt i ma zostać dodany od odpowiedniej GRUPY, czyli np. produkt, a nie ogólnie do XML. Zależnie od grupy ( produkt, wnetrza ) są listowane rekordy na stronie, nie mogę zmienić struktury XML.
darko
Wszystko jest ładnie opisanie w manualu, np. tutaj poczytaj, popatrz, jak działa. Nie ma w tym nic skomplikowanego.
deirathe
  1.  
  2. <?php
  3. $xml = <<<XML
  4. <?xml version='1.0' standalone='yes'?>
  5. <portfolio>
  6.   <produkt>
  7.   <project id='1'>
  8.   <name>chlodnicze</name>
  9.   <title>Urządzenia chłodnicze </title>
  10.   <meta_keywords>regał chłodniczy, scorpion</meta_keywords>
  11.   <meta_description>Wzornictwo przemysłowe - Urządzenia chłodnicze dla ES SYSTEM K - RCS Scorpion 03, Tucana</meta_description>
  12.   </project>
  13.   </produkt>
  14.   <wnetrza>
  15.   <project id='1'>
  16.   <name>Blachdom</name>
  17.   <title>Budynek biurowo - handlowy </title>
  18.   <meta_keywords>Projektowanie wnętrz biurowych, Blachdom 2</meta_keywords>
  19.   <meta_description>meta description</meta_description>
  20.   </project>
  21.   </wnetrza>
  22. </portfolio>
  23. XML;
  24.  
  25. $dom = new DOMDocument();
  26. $dom->loadXML($xml);
  27.  
  28. $portfolio = $dom->getElementsByTagName("portfolio")->item(0);
  29. $f = $dom->createDocumentFragment();
  30. $f->appendXML("
  31.  
  32. <project id='12'>
  33.  
  34. <name>nazwa</name>
  35.  
  36. <title>tytul</title>
  37.  
  38. <meta_keywords>meta</meta_keywords>
  39.  
  40. <meta_description>desc</meta_description>
  41.  
  42. </project>
  43. ");
  44. $portfolio->appendChild($f);
  45. echo $dom->saveXML();

Tak to mozesz osiagnac za pomoca dom document jezeli Ci sie nie chce tworzyc wszystkich potomkow za pomoca dom, a chcesz wciasnac fragment xmla
Largo
Witaj,

Extra, o to mi chodziło, na pewno zapamiętam tą lekcję. A teraz pojawił mi się następny problem. Dostęp do elementów XML jest tworzony na zasadzie atrybutu w węźle project. Jak z wszystkich możliwych elementów danej grupy ( produkt, wnetrza ) usunąć lub wyciągać dane z tego węzła?
deirathe
xpath, podaj przykladowy xml
Largo
Cytat(deirathe @ 8.01.2010, 14:22:31 ) *
xpath, podaj przykladowy xml


Witaj,

Np, ten z góry. Usuń element z wnętrz.
deirathe
  1. <?php
  2. $xml = <<<XML
  3. <?xml version='1.0' standalone='yes'?>
  4. <portfolio>
  5.   <produkt>
  6.   <project id='1'>
  7.   <name>chlodnicze</name>
  8.   <title>Urządzenia chłodnicze </title>
  9.   <meta_keywords>regał chłodniczy, scorpion</meta_keywords>
  10.   <meta_description>Wzornictwo przemysłowe - Urządzenia chłodnicze dla ES SYSTEM K - RCS Scorpion 03, Tucana</meta_description>
  11.   </project>
  12.   </produkt>
  13.   <wnetrza>
  14.   <project id='1'>
  15.   <name>Blachdom</name>
  16.   <title>Budynek biurowo - handlowy </title>
  17.   <meta_keywords>Projektowanie wnętrz biurowych, Blachdom 2</meta_keywords>
  18.   <meta_description>meta description</meta_description>
  19.   </project>
  20.   </wnetrza>
  21. </portfolio>
  22. XML;
  23.  
  24. $dom = new DOMDocument();
  25. $dom->loadXML($xml);
  26.  
  27. $portfolio = $dom->getElementsByTagName("portfolio")->item(0);
  28. $f = $dom->createDocumentFragment();
  29. $f->appendXML("
  30.  
  31. <project id='12'>
  32.  
  33. <name>nazwa</name>
  34.  
  35. <title>tytul</title>
  36.  
  37. <meta_keywords>meta</meta_keywords>
  38.  
  39. <meta_description>desc</meta_description>
  40.  
  41. </project>
  42. ");
  43. $portfolio->appendChild($f);
  44. $xpath = new DOMXPath($dom);
  45. $nodeList = $xpath->query("//wnetrza/project[@id='1']");
  46. $node = &$nodeList->item(0);
  47.  
  48. $node->parentNode->removeChild(&$node);
  49. echo $dom->saveXML();
Largo
Witaj,

A czemu nie mogę wyciągnąć tych danych z tego elementu?

  1. /* ID not send? */
  2. if( !$iProjectID )
  3. {
  4. return FALSE;
  5. }
  6.  
  7. /* Create DOM */
  8. $oDOM = new DOMDocument( '1.0' );
  9. $oDOM->load( $this->sXMLFile );
  10.  
  11. /* Find node! */
  12. $oXPath = new DOMXPath( $oDOM );
  13. $aNodeList = $oXPath->query( '//wnetrza/project[@id="'.$iProjectID.'"]' );
  14. $aNodeToReturn = $aNodeList->item(0);
  15.  
  16. /* Node exists? */
  17. if( $aNodeToReturn === NULL )
  18. {
  19. return FALSE;
  20. }
  21.  
  22. /* Parse into array */
  23. $aReturn = array();
  24. foreach( $aNodeToReturn AS $aNodeData )
  25. {
  26. $name = $aNodeData->getElementsByTagName( 'name' );
  27. $aReturn['sProjectName'] = $name->item(0)->nodeValue;
  28.  
  29. $title = $aNodeData->getElementsByTagName( 'title' );
  30. $aReturn['sProjectTitle'] = $title->item(0)->nodeValue;
  31.  
  32. $keywords = $aNodeData->getElementsByTagName( 'meta_keywords' );
  33. $aReturn['sMetaKeywords'] = $keywords->item(0)->nodeValue;
  34.  
  35. $description = $aNodeData->getElementsByTagName( 'meta_description' );
  36. $aReturn['sMetaDescription'] = $description->item(0)->nodeValue;
  37. }
  38.  
  39. print_r( $aReturn );


Potrzebuje je wyciągnąć do tablicy i NIC nie działa.

Witam,

Jak z tablicy wynikowej:

  1. (
  2. [0] => Array
  3. (
  4. [file] => wn/b1.jpg
  5. )
  6.  
  7. [1] => Array
  8. (
  9. [alt] => Aranżacja wystawy "Stół" - Bunkier Sztuki
  10. )
  11.  
  12. [2] => Array
  13. (
  14. [description] => <h1>Aranżacja wystawy V Biennale Sztuki Projektowania "Stół" - Bunkier Sztuki</h1>
  15. I nagroda w konkursie organizowanym przez Fundację Rzecz Piękna przy Wydziale Form Przemysłowych Krakowskiej
  16. Akademii Sztuk Pięknych. Współpraca: Małgorzata Serafin.
  17.  
  18. )
  19.  
  20. [3] => Array
  21. (
  22. [file] => wn/b2.jpg
  23. )
  24.  
  25. [4] => Array
  26. (
  27. [alt] => Aranżacja wystawy "Stół" - Bunkier Sztuki
  28. )
  29.  
  30. [5] => Array
  31. (
  32. [description] => <h1>Aranżacja wystawy V Biennale Sztuki Projektowania "Stół" - Bunkier Sztuki</h1>
  33. I nagroda w konkursie organizowanym przez Fundację Rzecz Piękna przy Wydziale Form Przemysłowych Krakowskiej
  34. Akademii Sztuk Pięknych. Współpraca: Małgorzata Serafin.
  35.  
  36. )
  37.  
  38. [6] => Array
  39. (
  40. [file] => wn/b3.jpg
  41. )
  42.  
  43. [7] => Array
  44. (
  45. [alt] => Aranżacja wystawy "Stół" - Bunkier Sztuki
  46. )
  47.  
  48. [8] => Array
  49. (
  50. [description] => <h1>Aranżacja wystawy V Biennale Sztuki Projektowania "Stół" - Bunkier Sztuki</h1>
  51. I nagroda w konkursie organizowanym przez Fundację Rzecz Piękna przy Wydziale Form Przemysłowych Krakowskiej
  52. Akademii Sztuk Pięknych. Współpraca: Małgorzata Serafin.
  53.  
  54. )
  55.  
  56. [9] => Array
  57. (
  58. [file] => wn/b4.jpg
  59. )
  60.  
  61. [10] => Array
  62. (
  63. [alt] => Aranżacja wystawy "Stół" - Bunkier Sztuki
  64. )
  65.  
  66. [11] => Array
  67. (
  68. [description] => <h1>Aranżacja wystawy V Biennale Sztuki Projektowania "Stół" - Bunkier Sztuki</h1>
  69. I nagroda w konkursie organizowanym przez Fundację Rzecz Piękna przy Wydziale Form Przemysłowych Krakowskiej
  70. Akademii Sztuk Pięknych. Współpraca: Małgorzata Serafin.
  71.  
  72. )
  73.  
  74. )

Stworzyć taką? http://wklejto.pl/53489
Taki kodem się posługuję:

  1. /* Create DOM */
  2. $oDOM = new DOMDocument( '1.0' );
  3. $oDOM->load( $this->sXMLFile );
  4.  
  5. /* Find node! */
  6. $oXPath = new DOMXPath( $oDOM );
  7. $aNodeImageList = $oXPath->query( '//'.$sGroupName.'/project[@id="'.$iProjectID.'"]/images/image' );
  8. $aaData = array();
  9.  
  10. /* List all */
  11. foreach( $aNodeImageList AS $aImages )
  12. {
  13. foreach( $aImages->childNodes AS $aImage )
  14. {
  15. if( $aImage->nodeName != '#text' )
  16. {
  17. $aaData[] = array( $aImage->nodeName => $aImage->nodeValue );
  18. }
  19. }
  20. }
  21.  
  22. return $aaData;
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.