![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 1.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
wiecie, jak w simplexml (php) mieć dostęp do node: glowny.dziecko.jakistam, gdzie xml jest :
<item id="glowny"> <item id="dziecko"> <item id="jakistam"> </item> </item> </item> ? używam simplexml jak napisać odwołanie xpath: coś na wzór: getPathByAttribute(["id"], "glowny.dziecko.jakistam") normalnie to notacją kropkową tworzy się ścieżkę bazującą na nazwach węzłów, a nie na atrybucie. Ten post edytował borovsky 25.06.2010, 09:31:08 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Ale po co tak, skoro identyfikator jest unikalny w całym dokumencie?
-------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 1.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
troszeczkę inaczej podchodzę do problemu. id składa się ze ścieżki atrybutów id root.child.child.node
sam atrybut id nie jest unikalny, zamierzam mieć też: root.node, root.child.node, root.child.child.child.child także ścieżka składająca się z szeregu wartości atrybutów id węzłow: od root schodząco do węzła pożądanego. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat troszeczkę inaczej podchodzę do problemu. id składa się ze ścieżki atrybutów id root.child.child.node sam atrybut id nie jest unikalny A być powinien. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Źle rozumiesz XML i pojęcie identyfikatora. Identyfikator jest ZAWSZE unikalny wartości elementów, nazwy w strukturze mogą się dublować. Sam plik XML ma zawsze strukturę:
<element_root> . elementy . </element_root> gdzie elementy przyjmują formę <element atrybut="jego_wartosc"> </element> lub <element atrybut="jego_wartosc" /> przy czym 1 wariant jest stosowany, gdy ma zawierać głębszą strukturę, gdyż jeśli tylko pojedynczą, to można go zamienić do formy 2 (o ile te dzieci same nie mają atrybutów). Twoja wersja więc ma sens tylko gdy dane dla dzieci są wspólne z rodzicem. Przykładem może być blokowisko. Jest jakieś jedno (element root), ale na nim są ulice (element 1 rzędu), których zapewne jest kilka. Ulica może wystąpić jako id, gdyż jest jednoznaczna (ale tylko do poziomu miasta! Jeśli jest kilka miast to już nie jest unikatowa). Następnym zagnieżdżeniem byłby numer bloku przy danej ulicy. Ale to już NIE MOŻE być id (gdyż ten sam numer może wystąpić na kilku ulicach). Można jednak przekształcić strukturę XML, by numer bloku był razem z nazwą ulicy, gdyż jest to już jednoznaczne. Jest to jednak gorsze rozwiązanie, gdyż upychamy możliwą dużą strukturę do płytko zagnieżdżonej, przez co wyszukiwanie jest za każdym razem na dużych zbiorach. Stąd lepsze rozwiązanie to
zamiast tego Do ulicy Piotra 1 w przypadku 1 odnieść się musielibyśmy: /blokowisko/ulica[id=Piotra]/numer[blok=1] a drugim: /blokowisko/ulica[id=Piotra_1] Niby drugi krótszy i fajniejszy, ale w przypadku rozbudowy struktury, pogłębianiu jej lub rozszerzaniu musimy mocno ingerować i zwracać uwagę co jest unikatowe, co nie i pojawia się o wiele więcej problemów z jednoznacznymi odwołaniami. Twój sposób jest zły z racji tego, że chcesz do wszystkiego id walnąć, nawet do numeru bloku zachowując prostotę struktury 1. W efekcie odwołanie do elementu z id=1 wywali błąd, bo jest takich kilka, co jest ewidentnym błędem programisty. Takie coś jest zwyczajnie zabronione w poprawnym XML. A co gdy oprócz bloków będziesz chciał wrzucać jeszcze piętra, numery mieszkań i nazwiska lokatorów? Stworzysz wszystko pooddzielane lub poupychasz wszystko do struktury pokroju: Zauważ, że można, ale wszystko Ci się do jednego ogromnego zbioru sprowadzi, w którym na dodatek zastosowanie ulicy jako id jest po prostu błędem (nie jest on unikalny... to musi stać się zwykłym atrybutem) i którego przeszukiwanie po wszystkich atrybutach może być obciążające serwer. taka struktura jest po prostu niewygodna.
Powód edycji: [thek]: Przykład z lokatorami
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 1.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
w tym xml mam sklep z kilkoma pozycjami, może źle nazwałem: nie chodzi w takim razie o id, lecz o identyfikacje produktu podając ścieżkę: obrazy.wnetrza.swiatla wlasnie chodzi tutaj o adres jak w strukturze katalogów systemowych: przecież plik w folderze costam, ktory jest w folderze subcostam, a nazywa sie pliczek.txt nie ma adresu pliczek.txt, bo taki pliczek moze jeszce gdzies istniec w innym folderze. dodatkowo: osobiście upieram się na jednolity (moze byc id) bo przeciez ilosc poziomów w takim sklepie (zagnieżdżanie podakategorii) jest zmienna. Rozumiem XML, ale jak widac źle się wyraziłem. w każdym razie myślałem, że nie trzeba tworzyc xpath w formie: /item[@id='obrazy']/item[@id='wnetrza']/item[@id='swiatla'] tylko cos na wzór (chodzi o jakas krótką formę): obrazy.wnetrza.swiatla oczywiscie tę długą forme jestem w stanie sobie wygenerować automatycznie, nawet mogę sobie napisać funkcję bez użycia xpath, jednak szukam uniwersalnych rekomendowanych rozwiązań. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Zauważ, że w takiej strukturze ów id JEST jednoznaczny i możesz odwołać się do niego poprzez id
![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 1.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
dzięki
![]() mi jednak zależy na dostępie poprzez złożenie ścieżki. mam jednak takie inne pytanie: jak z takiego xml:
jak ułożyć xpath, który będzie (sprawa dotyczy struktury z tego tematu) miał taki algorytm podaję ścieżkę: xml.costam.costam2 a xpath będzie każdy element sprawdzał: 1.czy node ma atrybut id o takiej wartości 2.jeśli nie, to czy ma nazwa o takiej wartości |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat mi jednak zależy na dostępie poprzez złożenie ścieżki. To się w końcu zdecyduj - przez własną konwencję nazewnictwa, czy przez XPath? Bo o ile pamiętam, to XPath miał nieco inną składnię niż ta, którą podajesz. Wg tej Twojej, trzeba by było najpierw napisać odpowiedni parser, który pozamienia znaki, dopiero potem poszuka po xpath. Cytat nawet mogę sobie napisać funkcję bez użycia xpath, jednak szukam uniwersalnych rekomendowanych rozwiązań. Wytłumacz mi jedno: po co sobie utrudniasz życie? Przecież parsując to coś i tak musisz wygenerować XPath, niezależnie od Twojej składni Cytat /item[@id='obrazy']/item[@id='wnetrza']/item[@id='swiatla'] Ile razy trzeba Ci jeszcze tłumaczyć, że ID musi być unikalne? Jak nie będzie, to nie mamy nawet o czym dyskutować, gdyż tak ma być i niektóre parsery będą wariować jak znajdą kilka takich samych identyfikatorów? Cytat 1.czy node ma atrybut id o takiej wartości 2.jeśli nie, to czy ma nazwa o takiej wartości Jak pisałem, raczej czeka Cię pisanie własnego parsera. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 34 Pomógł: 0 Dołączył: 1.09.2007 Ostrzeżenie: (0%) ![]() ![]() |
dzięki wam za pomoc.
moje utrudnianie sobie życia polega na tym, że uczę się, a jeśli uczę się sam, to nie mogę cały czas robić po najlżejszej linii oporu. Oczywiście, poradziłem sobie sam pisząc kod, ale porównam to do mojego doświadczenia: chciałem robić aplikacje RIA we flashu. (a siedzę w tym 5 lat) jednak po jakims czasie zdecydowałem się utrudnić sobie życie - próbując poznać do czego służy Adobe Flex. No i teraz robię w Flex i gdyby nie utrudnianie sobie życia - męczyłbym się w flash. Jeszcze jedno pytanie: czy atrybut ID jest zastrzeżony dla XML? czy nie może być to po prostu jakis sobie atrybut? |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 08:40 |