Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][XML] Dostęp do taga po atrybucie
Forum PHP.pl > Forum > XML, AJAX > XML
masahuku
Witam,

Mam pewien problem. Piszę dość dużą aplikację korzystającą z pliku XML dostarczanego przez zew. firmę (wolę pracować na bazach, jednak wola zleceniodawcy żeby działało na XML'u). Jednak XML jest dość dziwnie skonstruowany.

  1. <param nazwa="typ_wlasnosci" typ="text">xxx</param>
  2. <param nazwa="wojewodztwo" typ="text">xxx</param>
  3. <param nazwa="miasto" typ="text">xxx</param>


Wydaje się proste jednak w niektórych obiektach pojawiają się dodatkowe znaczniki <param> o innych nazwach więc praca na "indeksach" jest niemożliwa. Za pomocą xpatha wybieram sobie interesujące mnie nody, jednak nie wiem jak z tych nodów wybrać dalej parametr o zadanym atrybucie nazwa. W parakodzie (chciałbym żeby tak działało ale nie działa tongue.gif):

  1. $rekord->param[nazwa[wojewodztwo]];
zamiast
  1. $rekord->param[10];


Czyli chcę pobrać wartosc parametru o nazwie wojewodztwo. Myślałem o ponownym wykorzystaniu xpatha, ale obiawiam się, że przy takiej ilości "odbiegnięć" od normy może mi sie przesadnie to skomplikować. Wiecie może jak coś takiego zrobić ?

Do xmla dostaje się przez SimpleXML, a $rekord to obiekt powstający przez foreacha z $rekordy = $xml->xpath(warunki).

Pozdrawiam,
masahuku
erix
Cytat
(chciałbym żeby tak działało ale nie działa ):

Bo masz źle napisane zapytanie xpath. winksmiley.jpg

Zerknij na w3schools.
masahuku
A czy jak zrobie xpatha dokładnie do tego parametru to będę miał dostęp do innych parametrów w nodzie ?
Mój xpath wygląda:
  1. $rekordy=$xml->xpath("//dzial[@tab='".$_tab."' and @typ='".$_typ."']/oferta");
. Działa to tak, że wybiera mi noda o określonym tabie i type (oferta), a w tym są dopiero te parametry. Jak można sformułować xpatha inaczej ? Patrze na to w3c ale jestem tak zły, że mam blokadę w mózgu chyba tongue.gif.

EDIT: Czyżbym miał zrobić drugiego Xpatha który wybierze param[@nazwa='opis'] ? smile.gif. A jak to z wydajnością takiego cuda ? Nigdy nie pracowałem na tak rozbudowanych XML'ach (1.2 mb plik to imo dość sporo), ale np. 12 krotne przewalenie pliku (żeby wydobyć po kolei parametry) chyba zaboli wydajność ?

EDIT2: Wykorzystałem operator "|" do bezpośredniego dostępu do parametrów - rozwiązanie po bożemu czy niekoniecznie ? smile.gif
skowron-line
Przeczytałem 2 razy to co napisałeś i nie wiem o co chodzi najlepiej jak byś podał co chcesz osiągnąć, bo twój opis jest lekko mówiąc zagmatwany.
A jeżeli myślisz że xml 1.2mb to duży plik to jesteś w wielkim błędzie. Co miesiąc dostaje od jednej z sieci komórkowych bilingi w xml ok 60mb. i też nie wydaje mi się to dużo.
masahuku
Mam plik xml w postaci:

  1. <OBIEKT tab="" typ="">
  2. <param nazwa="costam1">tresc</param>
  3. <param nazwa="costam2">tresc</param>
  4. <param nazwa="costam3">tresc</param>
  5. <param nazwa="costam4">tresc</param>
  6. <param nazwa="costam5">tresc</param>
  7. </OBIEKT>
  8. <OBIEKT tab="" typ="">
  9. <podobiekt>
  10. <param nazwa="costam1">tresc</param>
  11. <param nazwa="costam2">tresc</param>
  12. <param nazwa="costam6">tresc</param>
  13. <param nazwa="costam3">
  14. <linia>tresc</linia>
  15. </param>
  16. <param nazwa="costam4">tresc</param>
  17. <podobiekt>
  18. </OBIEKT>


Chodzi o to że parametry nie są takie same dla wszystkich obiektów więc nie mogę zrobić ->param[x] (bo nie zawsze jest na tej samej pozycji). A potrzebuję tego, bo chce stworzyć listę obiektów i dopiero z niej to obsługiwać (te parametry nie-stałe nie są mi np. w ogóle potrzebne).

$rekordy=$xml->xpath("//OBIEKT[@tab='".$_tab."' and @typ='".$_typ."']/podobiekt"); - z tego otrzymuje tablice wszystkich podobiektów. Następnie chcę jakoś uzykać dostęp do np. param nazwa="costam3"->linia;

Póki co zrobiłem tak i działa ale nie wiem czy to poprawny tok myślenia:
  1. $rekordy=$xml->xpath("//OBIEKT[@tab='".$_tab."' and @typ='".$_typ."']/podobiekt | //OBIEKT[@tab='".$_tab."' and @typ='".$_typ."']/podobiekt/param[@nazwa="costam3"]);


i dzięki temu mam dostęp do wszystkich parametrów a $rekord->linia odowłuje się już bezpośrednio do paramateru o nazwie costam3. Problem jest taki że tych parametrów jest dużo - czy tak rozbudowany xpath nie zwariuje ? smile.gif Jak na moje to jest coś prostego ale normalnie wyjdę z siebie zaraz.
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.