Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: parser xml
Forum PHP.pl > Forum > PHP
Fixus
Witam,
mam problem. Piszę parser xml`a i zastanawiam się w jaki sposób zrobić zagnieżdząnie. Chodzi mi o to, że mogę mieć x poziomów zagnieżdżenia. Jak aplikacja ma automatycznie to robić. To znaczy nie chce pisać tyle pętli ile zagnieżdżeń tylko, żeby sam to sprawdzam czy jest zagnieżdżenie n-tego stopnia. Jak jest to wchodzi i sprawdza czy jest n+1 stopnia. Jak jest to wchodzi i tak dalej
wookieb
A dlaczego piszesz WŁASNY parser xml? Jakie są założenia?
erix
Rekurencja?

Poza tym, jak korzystasz z xml reader, to masz przecież tę samą funkcję wywoływaną dla każdego węzła. Sprawdzasz, jaki to węzeł, jeśli otwarcie -> zwiększasz zmienną, zamknięcie -> zmniejszasz.

Ale to rozważania w ciemno. winksmiley.jpg
Fixus
// edit
tu były głupoty, że aż mi smutno się robi dlatego już ich nie ma

pewnie istotnym faktem będzie wspomnienie, że chce wygenerować drzewo na podstawie tego xml`a winksmiley.jpg

coś nie tak kumam. Korzystam z xml reader`a i mam taki kodzik

  1. $xml = new XMLReader;
  2. $xml->open('xml.xml');
  3.  
  4. $doc = new DOMDocument;
  5.  
  6. // move to the first <product /> node
  7. while ($xml->read() && $xml->name !== 'HASLO');
  8.  
  9. // now that we're at the right depth, hop to the next <product/> until the end of the tree
  10. while ($xml->name === 'HASLO')
  11. {
  12. // either one should work
  13. //$node = new SimpleXMLElement($xml->readOuterXML());
  14. $node = simplexml_import_dom($doc->importNode($xml->expand(), true));
  15.  
  16. // now you can use $node without going insane about parsing
  17. // print_r($node->HASLO);
  18.  
  19. //echo $xml->getAttribute($node->HASLO->POZIOM);
  20.  
  21. // go to next <product />
  22. $xml->next('HASLO');
  23. }


no i fajnie wyświetli całą strukturę ALE jak np. wypisać tylko 1 poziom (każdy węzel ma atrybut poziom). np. chce wyświetlić tylko z poziomu 1 wtedy musiałbym zrobić tak

  1. if($node->HASLO->HASLO['poziom'] == 1)


no i jest manufaktura.

p.s. Powtarzanie się "HASLO" jest praiwdłowe. to jedyny znacznik w tym pliku xml. haslo zawiera haslo ktory zawiera kilka haslo
wookieb
Generalnie XMLReader jest trudno w obsłudze oraz wolniejszy w działaniu w porównaniu do simpleXML. Jeżeli xml-e będą małe bez problemu lepiej będzie użyć simpleXML albo też DOMDocument.
erix
Cytat
no i fajnie wyświetli całą strukturę ALE jak np. wypisać tylko 1 poziom (każdy węzel ma atrybut poziom). np. chce wyświetlić tylko z poziomu 1 wtedy musiałbym zrobić tak

:
Cytat
depth

Depth of the node in the tree, starting at 0



edit:
Cytat
Generalnie XMLReader jest trudno w obsłudze oraz wolniejszy w działaniu w porównaniu do simpleXML

Masz jakieś benchmarki? Z tego, co wiem, to XMLReader jest szybszy niż DOMDocument/SimpleXML.
Fixus
też słyszałem, że xmlreader jest szybszy. Mój xml waży 1mb i jest sparsowany i wyświetlony w formie powiedzmy tablicy błyskawicznie więc na osiągi nie narzekam.

Jednak to nie o to w tym temacie chodzi.
Struktura wygląda tak (mniej więcej)

<HASLO>
<HASLO POZIOM="0" NAZWA="JAKAS_NAZWA_1">
<HASLO POZIOM="1" NAZWA="JAKAS_NAZWA_2">
<HASLO POZIOM="2" NAZWA="JAKAS_NAZWA_4"/>
</HASLO>
<HASLO POZIOM="1" NAZWA="JAKAS_NAZWA_3">
<HASLO POZIOM="2" NAZWA="JAKAS_NAZWA_5"/>
</HASLO>
</HASLO>
</HASLO>

Jakoś mniej więcej tak. No i chce np. wygenerować tylko 1 poziom to musiałbym

$xml->HASLO->HASLO['NAZWA']

a to manufaktura
wookieb
Jak otworzę bloga to opiszę.
Zrób sobie testowego xmla z 1000 elementów
Przeleć xmlreaderem po każdym (next w pętli + co tam chcesz) a potem simplexml-em i foreachem.
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.