Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]DOM XML Zapisanie wyszukanej wartości do pliku XML - Błąd
Forum PHP.pl > Forum > Przedszkole
DonPolaczek
Witam serdecznie mam taki problem a mianowicie posiadam plik txt z którego wczytuję liste id którę maja zostać wyszukane w pliku xml i DOM XML elegancko mi wyszukuję te id ale nie możę wyświetlić całej reszty tego pliku XML po tym id wywala mi bład który umieścilem równiez poniżej:
  1. Fatal error: Call to undefined method DOMElement::saveXML() in C:\xampp\htdocs\ParserXML\test.php on line 20


  1. Lista-ID.txt:
  2. 29184
  3. 29183
  4. 29149
  5. 28890


Skrypt PHP:
  1. <?php
  2.  
  3. $lines = file('lista-id.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);;
  4. $xmlDoc = new DOMDocument('1.0', 'UTF-8');
  5. $xmlDoc->xmlStandalone = false;
  6. $xmlDoc->formatOutput = true;
  7. $xmlDoc->load('marynary.xml');
  8.  
  9. $searchNode = $xmlDoc->getElementsByTagName( "product" );
  10.  
  11.  
  12. foreach( $searchNode as $searchNode ) {
  13.  
  14. $valueID = $searchNode->getAttribute('id');
  15.  
  16. foreach ($lines as $line_num => $line) {
  17.  
  18. if ($valueID == $line) {
  19.  
  20. echo $searchNode->saveXML() . "\n";
  21.  
  22. }
  23.  
  24. }
  25.  
  26. }
  27.  
  28.  
  29. ?>


Fragment Pliku XML:
  1. <?xml version="1.0" encoding="UTF-8"?><offer file_format="IOF" generated="2015-09-03 13:08:24" xmlns="http://www.iai-shop.com/developers/iof.phtml" version="2.5" extensions="yes"><products language="pol" xmlns:iaiext="http://www.iai-shop.com/developers/iof/extensions.phtml"><product id="28853" currency="PLN"><producer id="1392111450" name="COOLBERG"/>
  2. <category id="1214553937" xml:lang="pol" name="A-Odzież Dla Niego/Marynarki męskie"/>
  3. <unit id="0" xml:lang="pol" name="szt."/>
  4. <series id="9" xml:lang="pol" name="MARYNARKA"/>
  5. <card url="http://www.denley.pl/product-pol-28853-Marynarka-meska-COOLBERG-606-K-granatowo-brazowa.html" />
  6. <description><name xml:lang="cze"><![CDATA[COOLBERG 606-K - GRANATOWO-BRĄZOWY]]></name>
  7. <name xml:lang="eng"><![CDATA[COOLBERG 606-K - GRANATOWO-BRĄZOWY]]></name>
  8. <name xml:lang="ger"><![CDATA[COOLBERG 606-K - GRANATOWO-BRĄZOWY]]></name>
  9. <name xml:lang="pol"><![CDATA[Marynarka męska COOLBERG 606-K granatowo-brązowa]]></name>
  10. <version name="GRANATOWO-BRĄZOWY" ><name xml:lang="cze"><![CDATA[NÁMOŘNÍ MODRO-HNĚDÁ]]></name>
  11. <name xml:lang="eng"><![CDATA[GRANATOWO-BRĄZOWY]]></name>
  12. <name xml:lang="ger"><![CDATA[GRANATOWO-BRĄZOWY]]></name>
  13. <name xml:lang="pol"><![CDATA[GRANATOWO-BRĄZOWY]]></name>
  14. </version>
  15. <long_desc xml:lang="cze"><![CDATA[
  16. <div id="projector-longdescription-description">
  17. <span class="tekst">
  18. <ul>
  19. <li>Oferowana marynarka jest nowa.</li>
  20. <li>Oryginalnie zapakowana z kompletem metek.</li>
  21. <li>Absolutny must have tego sezonu.</li>
  22. <li>Idealna na co dzień.</li>
  23.  
  24.  
  25. <li>Materiał: 15% Bawełna,85% Poliester</li>
  26. </ul>
  27. </span>
  28. <br/>
  29. </div>
  30.  
  31. <div id="projector-longdescription-table">
  32. <div class="rozmiar">
  33. <table class="wyrownanie">
  34. <tr>
  35. <td>
  36. <img class="lewo" src="http://www.denley.pl/data/include/cms/Wymiary/Wymiary/Wymiary.jpg"/>
  37. </td>
  38. <td>
  39. <table id="tabela">
  40. <tbody>
  41. <tr class="naglowek">
  42. <th class="inny_wygladnag" width="68 px"> </th><th class="wyglad_kolumna" width="68 px">M</th><th class="wyglad_kolumna" width="68 px">L</th><th class="wyglad_kolumna" width="68 px">XL</th><th class="wyglad_kolumna" width="68 px">XXL</th>
  43. </tr>
  44. <tr>
  45. <td class="inny_wyglad">A</td>
  46. <td class="inny_wyglad2">70</td>
  47. <td class="inny_wyglad2">72</td>
  48. <td class="inny_wyglad2">74</td>
  49. <td class="inny_wyglad2">76</td>
  50. </tr>
  51. <tr class="wiersz">
  52. <td class="inny_wyglad">B</td>
  53. <td class="inny_wyglad2">56</td>
  54. <td class="inny_wyglad2">58</td>
  55. <td class="inny_wyglad2">59</td>
  56. <td class="inny_wyglad2">61</td>
  57. </tr>
  58. <tr>
  59. <td class="inny_wyglad">C</td>
  60. <td class="inny_wyglad2">54</td>
  61. <td class="inny_wyglad2">56</td>
  62. <td class="inny_wyglad2">57</td>
  63. <td class="inny_wyglad2">58</td>
  64. </tr>
  65. <tr class="wiersz">
  66. <td class="inny_wyglad">D</td>
  67. <td class="inny_wyglad2">80</td>
  68. <td class="inny_wyglad2">81</td>
  69. <td class="inny_wyglad2">83</td>
  70. <td class="inny_wyglad2">84</td>
  71. </tr>
  72. <tr>
  73. <td class="inny_wyglad">E</td>
  74. <td class="inny_wyglad2">46</td>
  75. <td class="inny_wyglad2">47</td>
  76. <td class="inny_wyglad2">48</td>
  77. <td class="inny_wyglad2">49</td>
  78. </tr>
  79. </tbody>
  80. </table>
  81. </td>
  82. </tr>
  83.  
  84. </table>
  85. </div>
  86. </div>
  87. </div>]]></long_desc>
  88. <long_desc xml:lang="eng"><![CDATA[
  89. <div id="projector-longdescription-description">
  90. <span class="tekst">
  91. <ul>
  92. <li>Oferowana marynarka jest nowa.</li>
  93. <li>Oryginalnie zapakowana z kompletem metek.</li>
  94. <li>Absolutny must have tego sezonu.</li>
  95. <li>Idealna na co dzień.</li>
  96.  
  97.  
  98. <li>Materiał: 15% Bawełna,85% Poliester</li>
  99. </ul>
  100. </span>
  101. <br/>
  102. </div>
  103.  
  104. <div id="projector-longdescription-table">
  105. <div class="rozmiar">
  106. <table class="wyrownanie">
  107. <tr>
  108. <td>
  109. <img class="lewo" src="http://www.denley.pl/data/include/cms/Wymiary/Wymiary/Wymiary.jpg"/>
  110. </td>
  111. <td>
  112. <table id="tabela">
  113. <tbody>
  114. <tr class="naglowek">
  115. <th class="inny_wygladnag" width="68 px"> </th><th class="wyglad_kolumna" width="68 px">M</th><th class="wyglad_kolumna" width="68 px">L</th><th class="wyglad_kolumna" width="68 px">XL</th><th class="wyglad_kolumna" width="68 px">XXL</th>
  116. </tr>
  117. <tr>
  118. <td class="inny_wyglad">A</td>
  119. <td class="inny_wyglad2">70</td>
  120. <td class="inny_wyglad2">72</td>
  121. <td class="inny_wyglad2">74</td>
  122. <td class="inny_wyglad2">76</td>
  123. </tr>
  124. <tr class="wiersz">
  125. <td class="inny_wyglad">B</td>
  126. <td class="inny_wyglad2">56</td>
  127. <td class="inny_wyglad2">58</td>
  128. <td class="inny_wyglad2">59</td>
  129. <td class="inny_wyglad2">61</td>
  130. </tr>
  131. <tr>
  132. <td class="inny_wyglad">C</td>
  133. <td class="inny_wyglad2">54</td>
  134. <td class="inny_wyglad2">56</td>
  135. <td class="inny_wyglad2">57</td>
  136. <td class="inny_wyglad2">58</td>
  137. </tr>
  138. <tr class="wiersz">
  139. <td class="inny_wyglad">D</td>
  140. <td class="inny_wyglad2">80</td>
  141. <td class="inny_wyglad2">81</td>
  142. <td class="inny_wyglad2">83</td>
  143. <td class="inny_wyglad2">84</td>
  144. </tr>
  145. <tr>
  146. <td class="inny_wyglad">E</td>
  147. <td class="inny_wyglad2">46</td>
  148. <td class="inny_wyglad2">47</td>
  149. <td class="inny_wyglad2">48</td>
  150. <td class="inny_wyglad2">49</td>
  151. </tr>
  152. </tbody>
  153. </table>
  154. </td>
  155. </tr>
  156.  
  157. </table>
  158. </div>
  159. </div>
  160. </div>]]></long_desc>
  161. <long_desc xml:lang="ger"><![CDATA[
  162. <div id="projector-longdescription-description">
  163. <span class="tekst">
  164. <ul>
  165. <li>Oferowana marynarka jest nowa.</li>
  166. <li>Oryginalnie zapakowana z kompletem metek.</li>
  167. <li>Absolutny must have tego sezonu.</li>
  168. <li>Idealna na co dzień.</li>
  169.  
  170.  
  171. <li>Materiał: 15% Bawełna,85% Poliester</li>
  172. </ul>
  173. </span>
  174. <br/>
  175. </div>
  176.  
  177. <div id="projector-longdescription-table">
  178. <div class="rozmiar">
  179. <table class="wyrownanie">
  180. <tr>
  181. <td>
  182. <img class="lewo" src="http://www.denley.pl/data/include/cms/Wymiary/Wymiary/Wymiary.jpg"/>
  183. </td>
  184. <td>
  185. <table id="tabela">
  186. <tbody>
  187. <tr class="naglowek">
  188. <th class="inny_wygladnag" width="68 px"> </th><th class="wyglad_kolumna" width="68 px">M</th><th class="wyglad_kolumna" width="68 px">L</th><th class="wyglad_kolumna" width="68 px">XL</th><th class="wyglad_kolumna" width="68 px">XXL</th>
  189. </tr>
  190. <tr>
  191. <td class="inny_wyglad">A</td>
  192. <td class="inny_wyglad2">70</td>
  193. <td class="inny_wyglad2">72</td>
  194. <td class="inny_wyglad2">74</td>
  195. <td class="inny_wyglad2">76</td>
  196. </tr>
  197. <tr class="wiersz">
  198. <td class="inny_wyglad">B</td>
  199. <td class="inny_wyglad2">56</td>
  200. <td class="inny_wyglad2">58</td>
  201. <td class="inny_wyglad2">59</td>
  202. <td class="inny_wyglad2">61</td>
  203. </tr>
  204. <tr>
  205. <td class="inny_wyglad">C</td>
  206. <td class="inny_wyglad2">54</td>
  207. <td class="inny_wyglad2">56</td>
  208. <td class="inny_wyglad2">57</td>
  209. <td class="inny_wyglad2">58</td>
  210. </tr>
  211. <tr class="wiersz">
  212. <td class="inny_wyglad">D</td>
  213. <td class="inny_wyglad2">80</td>
  214. <td class="inny_wyglad2">81</td>
  215. <td class="inny_wyglad2">83</td>
  216. <td class="inny_wyglad2">84</td>
  217. </tr>
  218. <tr>
  219. <td class="inny_wyglad">E</td>
  220. <td class="inny_wyglad2">46</td>
  221. <td class="inny_wyglad2">47</td>
  222. <td class="inny_wyglad2">48</td>
  223. <td class="inny_wyglad2">49</td>
  224. </tr>
  225. </tbody>
  226. </table>
  227. </td>
  228. </tr>
  229.  
  230. </table>
  231. </div>
  232. </div>
  233. </div>]]></long_desc>

Chciałbym aby po tym danym id z listy została wyświetlona reszta pliku. I nie tylko text bo tak da się zrobić za pomocą nodevalue tylko cały xml. Czy ktoś jest w stanie mi pomóc?
Wywala taki błąd:
  1. Fatal error: Call to undefined method DOMElement::saveXML() in C:\xampp\htdocs\ParserXML\test.php on line 20
nospor
Cytat
XM wywala mi bład
To naprawde taki tajny i poufny ten blad, ze nie raczyles go nam podac?

Poza faktem bezsensownej poufnosci bledu, nie rozumiem Twojej logiki.
Najpierw szukasz
$searchNode = $xmlDoc->getElementsByTagName( "product" );

A potem to co znalazles probujesz ni z gruszki ni zpietruszki zapisac:
$searchNode->saveXML()

Ale gdzie chcesz to zapisac? Przeciesz szukac i zapisujesz teoretycznie w tym samym pliku...

edit: nom, komunikat bledu mowi wlasnie o tym o czym pisze. wykonujesz ni z gruszki saveXML na obiekcie ELement, podczas gdy w manualu wyraźnie napisane, ze saveXML jest metodą Document a nie Element
DonPolaczek
Zobacz teraz dodałem już komunikat błędu wcześniej wyświetlałem to tak i wszystko było by okej gdyby nie wyświetlało mi samego tekstu. a Chcem uzyskać cały fragment XML po danym id.

  1. <?php
  2.  
  3. $lines = file('lista-id.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);;
  4. $xmlDoc = new DOMDocument;
  5. $xmlDoc->load('marynary.xml');
  6.  
  7. $searchNode = $xmlDoc->getElementsByTagName( "product" );
  8.  
  9.  
  10.  
  11. foreach( $searchNode as $searchNode ) {
  12.  
  13. $valueID = $searchNode->getAttribute('id');
  14.  
  15. foreach ($lines as $line_num => $line) {
  16.  
  17. if ($valueID == $line) {
  18.  
  19. echo $searchNode->nodeValue . "\n";
  20.  
  21. }
  22.  
  23. }
  24.  
  25. }
  26. ?>


EDIT: Ale zobacz zrobie to poprawnie o tak i uzyskam błąd:

  1. if ($valueID == $line) {
  2.  
  3. echo $searchNode->save('document.xml');
  4.  
  5. }

Fatal error: Call to a member function save() on string in C:\xampp\htdocs\ParserXML\test.php on line 19
nospor
No to skoro chcesz uzyskac caly fragment to po grzyba robisz saveXML?? Save sluzy zapisaniu czegos a nie pobraniu. Kurcze, strzelanie na lewo i na prawo bez zastanowienia niczemu nie sluzy... Nie stoisz na przeciwko armii zombi gdzie mozesz sobie strzelac bez celowania i zawsze trafisz.
DonPolaczek
No nie wiem czytałem na ten temat i nie ma takiej funkcji która wyświetli mi całą zawartość pliku. Próbowałem zapisać do XML ponieważ w manual było napisane że ta funkcja zapisuję wszystkie wartości i atrybuty a więc po sprawdzeniu
  1. foreach ($lines as $line_num => $line) {
  2.  
  3. if ($valueID == $line) {
  4.  
  5. echo $searchNode->save('document.xml');
  6.  
  7. }

Chciałem zapisać cały znalezioną wartość po id.
nospor
Musisz sie zdecydowac czy chcesz zapisac czy wyswietlic. To dwie rozne rzeczy smile.gif
I nie, skoncz juz z tym zapisywaniem smile.gif
DonPolaczek
No dobrze przyjmijmy że chcem wyświetlić i zrobiłem to właśnie tak:
  1. if ($valueID == $line) {
  2.  
  3. echo $searchNode->nodeValue . "\n";
  4.  
  5. }


i teraz własnie nastał mój problem który męczy mnie już z 4 godziny wyświetlana się sam text oraz html bez znaczników XML. A potrzebuję te znaczniki ponieważ skyrpt służy jako parser i pózniej ten XML chcem wgrać do programu z tłumaczeniem.
Miałbyś dla mnie jakąś podpowiedź?
nospor
Masz uzyc saveHTML ale na Document a nie na Element
http://php.net/manual/en/class.domelement.php
w komentach masz pare przykladow
DonPolaczek
W jakims sensie nie jako Element a Document coś w tym stylu:
  1. <?php
  2.  
  3. $lines = file('lista-id.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  4. $xmlDoc = new DOMDocument;
  5. $xmlDoc->load('marynary.xml');
  6.  
  7. $searchNode = $xmlDoc->getElementsByTagName( "product" );
  8.  
  9.  
  10.  
  11. foreach( $searchNode as $searchNode ) {
  12.  
  13. $valueID = $searchNode->getAttribute('id');
  14.  
  15. foreach ($lines as $line_num => $line) {
  16.  
  17. if ($valueID == $line) {
  18.  
  19. $xmlDoc .= $searchNode->ownerDocument->saveHTML();
  20.  
  21. }
  22.  
  23. }
  24.  
  25. }
  26.  
  27.  
  28. ?>


Witam ponownie czy jest mi ktoś w stanie pomóc?
Pyton_000
Przede wszystkim zmień nazwy:
  1. foreach( $searchNode as $searchNode ) {

Zemści się to na Tobie kiedyś.
DonPolaczek
No dzięki zmieniłęm już a mogłbyś mi poradzić jakoś na ten mój problem już trochę się z tym męcze.
Pyton_000
Powiedz jeszcze raz co chcesz dokładnie osiągnąć.
DonPolaczek
a Więc tak wyszkuje z listy w txt id skrypt znajduję mi to id i wyświetla je wraz z zawartości z pliku xml a wyświetlana zawartość jest tylko tekstem oraz htmlem a chciałbym aby wyświetlało się wszystko wraz z tagami XML.
Pyton_000
  1. <?php
  2.  
  3. $lines = [28853,29183,29149,28890,];
  4. $xml = simplexml_load_file('offer.xml', null, );
  5. $xml->registerXPathNamespace('c', 'http://www.iai-shop.com/developers/iof.phtml');
  6.  
  7. $result = $xml->xpath('/c:offer/c:products/c:product');
  8. while(list( , $node) = each($result)) {
  9. if(in_array((string)$node->attributes()['id'], $lines)) {
  10. echo htmlentities($node->asXML());
  11. }
  12. }
DonPolaczek
Zrobiłem tak i wszystko jest okej ale kurdę zapisuję tylko jedno id nie 4 z listy i w takim moim sposobie listy i w twoim jak by gdzieś się pętla zatrzymywała.

  1. <?php
  2.  
  3. $lines = file('lista-id.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  4. $xml = simplexml_load_file('marynary.xml', null);
  5. $xml->registerXPathNamespace('c', 'http://www.iai-shop.com/developers/iof.phtml');
  6.  
  7. $result = $xml->xpath('/c:offer/c:products/c:product');
  8.  
  9. while(list( , $node) = each($result)) {
  10.  
  11. if(in_array((string)$node->attributes()['id'], $lines)) {
  12.  
  13. echo htmlentities($node->asXML('test.xml'));
  14. }
  15. }
  16. ?>


Teraz jak zrobiłem mu zapisywanie do 4 róznych plików to jest okej. Ale może znajdzie ktoś inne rozwiązanie jak w razie czego udostępniam swoje może komuś się przyda.

  1. <?php
  2.  
  3. $lines = file('lista-id.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  4. $xml = simplexml_load_file('marynary.xml', null);
  5. $xml->registerXPathNamespace('c', 'http://www.iai-shop.com/developers/iof.phtml');
  6.  
  7. $result = $xml->xpath('/c:offer/c:products/c:product');
  8. $i=0;
  9. while(list( , $node) = each($result)) {
  10.  
  11. if(in_array((string)$node->attributes()['id'], $lines)) {
  12. $i++;
  13. echo htmlentities($node->asXML('Log'. $i .'.xml'));
  14. }
  15.  
  16. }
  17. ?>
Pyton_000
Przecież zapisujesz do tego samego pliku, co za tym idzie nadpisujesz poprzednią zawartość...
DonPolaczek
W tym poprzedni co wysłałeś faktycznie tak było i zapisywało tylko jedno id ale w tym tutaj:
  1. <?php
  2.  
  3. $lines = file('lista-id.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  4. $xml = simplexml_load_file('marynary.xml', null);
  5. $xml->registerXPathNamespace('c', 'http://www.iai-shop.com/developers/iof.phtml');
  6.  
  7. $result = $xml->xpath('/c:offer/c:products/c:product');
  8. $i=0;
  9. while(list( , $node) = each($result)) {
  10.  
  11. if(in_array((string)$node->attributes()['id'], $lines)) {
  12. $i++;
  13. echo htmlentities($node->asXML('Log'. $i .'.xml'));
  14. }
  15.  
  16. }
  17. ?>


Zapisuję do 4 róznych plików odpowiada za to zmienna $i która w tym przypadku wywołuję się 4 razy ponieważ są 4 id i tworzy mi 4 pliki Log1,xml Log2.xml Log3.xml oraz Log4.xml z każdym innym id kwestia teraz że muszę łączyć te pliki i wiem że na pewno jest inne rozwiązanie aby odpowiednio to zadziałało.
A tak poza tym dziękuję za pomoc.
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.