Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z przetworzeniem XML w PHP atrybuty id w akapitach
Forum PHP.pl > Forum > XML, AJAX
wegorz10
Witam,

mam problem z przetworzeniem poniższego pliku xml:

  1. <parameters>
  2. <p id="1">57/4174/OGS</p>
  3. <p id="2">NOW-BUD</p>
  4. <p id="3">2015-08-17 15:12:12.0216</p>
  5. <p id="5">2013-05-08 00:00:00.0000</p>
  6. <p id="10">33000.0000</p>
  7. <p id="13">33.0000</p>
  8. <p id="18">BUDOWLANA</p>
  9. <p id="26">AKTUALNA</p>
  10. <p id="36">DZIAŁKA</p>
  11. <p id="39"></p>
  12. </parameters>


Dotychczas każdy znacznik miał indywidualną nazwę. Teraz są to znaczniki <p> z atrybutami id. Jak mam się do nich dostać w celu wyświetlenia za pomocą php?

Korzystam z simplexml.

  1. $ofert = simplexml_load_file("plik.xml");
  2.  
  3. foreach($oferty as $ofertyy)
  4. {
  5.  
  6. $zmienna1= $ofertyy->i tutaj nie wiem jak się odwołać do parametrów;
  7. }
  8.  
  9.  


Z góry dzięki za wskazówki.
mar1aczi
Zajrzyj tutaj: http://www.w3schools.com/php/php_xml_simplexml_get.asp do "PHP SimpleXML - Get Attribute Values"
Wartości dla id są zapewne jakoś opisane, tzn. dane id przedstawia konkretny atrybut. Musisz/powinieneś to mieć gdzieś zmapowane.
wegorz10
Dzięki za odpowiedź.

Mam faktycznie do tego pliku osobny plik xml o nazwie definictions.

Zawiera on nazwy poszczególnych id. Przykład:

  1. <parameters>
  2. <p id="1">
  3. <name>numer oferty</name>
  4. <type>4</type>
  5. </p>
  6. <p id="2">
  7. <name>biuro wprowadzające</name>
  8. <type>4</type>
  9. </p>
  10. </parameters>


Tylko pytanie jak skojarzyć te dwa pliki w jeden, abym mógł odwoływać się do wartości?
mar1aczi
Znasz zatem "objaśnienie" dla danej wartości id. W zależności teraz co potrzebujesz, wiesz które id (o jakiej wartości) wyświetlić/przetwarzać.
wegorz10
Zaczynam pomału kumać. Jednak nadal nie wiem jak zrealizować to za pomocą php. Załóżmy, że z pliku xml:

  1. <offer>
  2. <parameters>
  3. <p id="1">57/4174/OGS</p>
  4. <p id="2">abc</p>
  5. </parameters>
  6. </offer>
  7.  
  8. <offer>
  9. <parameters>
  10. <p id="1">57/4174/OGS</p>
  11. <p id="2">def</p>
  12. </parameters>
  13. </offer>


chcę za pomocą php wyświetlić wartości z <p id="2"> za pomocą pętli foreach.

Jak zatem skojarzyć ten plik z plikiem xml:

  1. <parameters>
  2. <p id="1">
  3. <name>numer oferty</name>
  4. <type>4</type>
  5. </p>
  6. <p id="2">
  7. <name>biuro wprowadzające</name>
  8. <type>4</type>
  9. </p>
  10. </parameters>


Nie mogę przecież użyć odwołania $xml->'p id=2'; Musi to przebiegać w jakiś inny sposób. Skoro wiemy, że id=2 to 'biuro wprowadzające' to jak skojarzyć ze sobą te dwa dokumenty.

Z góry dzięki za wskazówki.
mar1aczi
Troszkę nie doczytałeś z poprzednich linków, które podałem.
Wypisanie atrybutów id dla węzłów:
Kod
$xml=simplexml_load_file("params.xml") or die("Error: Cannot create object");

foreach($xml->children() as $child) {
    foreach($child->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
    }
}


W tym drugim pliku xml masz opisane co dana wartość id oznacza. Jak chcesz skorzystać z niego załaduj jego zawartość do kolejnego obiektu xml.
wegorz10
Wszystko rozumiem, jednak nie chcę wyświetlać wartości atrybutów id tylko wartości, któa kryje się pod tym znacznikiem.

Tzn. jeśli mamy w pliku xml znaczniki:

  1. <p id="1">kot</p>
  2. <p id="2">pies</p>


to chciałbym wyświetlić za pomocą php informację:

1 - kot
2 - pies

i tego właśnie nie wiem. Póki co udaje mi się wyświetlić tylko wartości atrybutów id. Ale nie mogę wyświetlić tego, ze np. pod id=1 kryje się kot.

Wiem, że pewnie rozwiązanie jest proste, ale proszę wybaczyć moją dociekliwość. W kwestii xml`a jestem niezorientowany.
mar1aczi
Dla takiej struktury XMLa
  1. <offers>
  2. <offer>
  3. <parameters>
  4. <p id="1">57/4174/OGS</p>
  5. <p id="2">NOW-BUD</p>
  6. <p id="3">2015-08-17 15:12:12.0216</p>
  7. <p id="5">2013-05-08 00:00:00.0000</p>
  8. <p id="10">33000.0000</p>
  9. <p id="13">33.0000</p>
  10. <p id="18">BUDOWLANA</p>
  11. <p id="26">AKTUALNA</p>
  12. <p id="36">DZIAŁKA</p>
  13. <p id="39"></p>
  14. </parameters>
  15. </offer>
  16.  
  17. <offer>
  18. <parameters>
  19. <p id="1">57/4174/OGS</p>
  20. <p id="2">NOW-BUD2</p>
  21. <p id="3">2015-08-17 15:12:12.0216</p>
  22. <p id="5">2013-05-08 00:00:00.0000</p>
  23. <p id="10">33000.0000</p>
  24. <p id="13">31.0000</p>
  25. <p id="18">BUDOWLANA</p>
  26. <p id="26">AKTUALNA</p>
  27. <p id="36">DZIAŁKA</p>
  28. <p id="39"></p>
  29. </parameters>
  30. </offer>
  31. </offers>

wyświetlanie wg. Tego czego oczekujesz:
  1. $xml=simplexml_load_file("params.xml") or die("Error: Cannot create object");
  2.  
  3. foreach($xml->children() as $offer) {
  4. foreach($offer->children() as $params) {
  5. foreach($params as $p) {
  6. foreach($p->attributes() as $a => $b) {
  7. echo $b,": ",$p[0],"<br />";
  8. }
  9. }
  10. }
  11. }

Możliwe, że da się to wykonać bardziej elegancko.
wegorz10
Super, dzięki!

A jak za pomocą xpath wybrać tylko te oferty, które w <p id="18"> będą miały wartość BUDOWLANA?

EDIT

Poradziłem sobie. Postanowiłem zapisywać wszystkie dane w bazie. Na niej łatwiej wykonywać wszelkiego rodzaju filtry i zapytania.

Dzięki za pomoc. Będziesz w Poznaniu to się odezwij. Stawiaj piwo ;-)
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.