Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML]Stosować atrybuty czy węzły
Forum PHP.pl > Forum > Przedszkole
gargamel
Tworzę sporego XML-a i tak się zastanawiam jak będzie lepiej.
XML będzie zawierał sporą ilość elementów, do których będę musiał się jakoś odwołać.
Mam do wyboru
1. Każdemu z elementów nadać unikalny identyfikator jako atrybut
2. Owy identyfikator umieścić jako dziecko danego elementu
Taki XML w uproszczeniu wyglądał by następująco:

Wariant 1:
  1. <test>
  2. <item id="1">
  3. <element>1</element>
  4. </item>
  5. <item id="2">
  6. <element>1</element>
  7. </item>
  8. <item id="3">
  9. <element>1</element>
  10. </item>
  11. .
  12. .
  13. .
  14. </test>


Wariant 2:
  1. <test>
  2. <item>
  3. <id>1</id>
  4. <element>some data</element>
  5. </item>
  6. <item>
  7. <id>2</id>
  8. <element>some data</element>
  9. </item>
  10. <item>
  11. <id>3</id>
  12. <element>some data</element>
  13. </item>
  14. .
  15. .
  16. .
  17. </test>

Chciałem sprawdzić, która metoda będzie wydajniejsza.

Napisałem taki kawałek kodu aby to sprawdzić:
  1. <?php
  2. function getNodeByAttr( $nodes, $attribName, $attribValue ){
  3. foreach( $nodes as $node ){
  4. $temp = $node -> attributes();
  5. if($temp[$attribName]==$attribValue) return $node;
  6. }
  7. }
  8.  
  9. function getNodeByChild( $nodes, $childNodeName, $childNodeValue ){
  10. foreach( $nodes as $node ){
  11. if( $node -> $childNodeName == $childNodeValue) return $node;
  12. }
  13. }
  14.  
  15.  
  16. $attr = new SimpleXMLElement( 'a.xml', null, true);
  17. $node = new SimpleXMLElement( 'n.xml', null, true);
  18.  
  19. $t1 = microtime(true);
  20. for($i=0;$i<1000;$i++){
  21. getNodeByAttr( $attr -> item, 'id', '50' );
  22. }
  23. $t2 = microtime(true);
  24.  
  25. $t3 = microtime(true);
  26. for($j=0;$j<1000;$j++){
  27. getNodeByChild( $node -> item, 'id', '50' );
  28. }
  29. $t4 = microtime(true);
  30.  
  31. echo "By attrib: ".( $t2-$t1 )."s <br>";
  32. echo "By node: ".( $t4-$t3 )."s";
  33. ?>


I co się okazało ( w sumie mnie to nie dziwi, bo opcja 1 uruchamia dodatkowo funkcję attributes() ) że wrzucając identyfikatory w węzły skrypt działa zdecydowanie szybciej.
I teraz dylemat, bo mimo wszystko poprawniejszym wydaje się sposób 1... Co o tym myślicie?

qrzysztof
Ekspertem od XML-a może nie jestem, ale wydaje mi się, że niepotrzebnie masz dylemat. Ja wybrałem zdecydowanie wariant 2, jeszcze zanim przeczytałem to, co napisałeś na końcu.

Moim zdaniem jeśli coś jest wydajniejsze to nie ma co snuć rozważań na temat większej i mniejszej poprawności, ale to tylko moje zdanie smile.gif
miloszmuszynski
Użyłbym drugiej wersji. Atrybuty są fajne, ale skoro wszystkie elementy mają ID, to nie ma raczej potrzeby wyrzucania go do atrybutów - to jest normalna własność elementów.

A z ciekawości: jak duża była ta różnica w wydajności?
gargamel
No taki trochę typowy dylemat między tym co czytelne dla oka, a co dla komputera.
W sumie XML często jest udostępniany innym "na zewnątrz", więc dobrze by było aby był spójny i logiczny. No ale chyba jednak zdecyduję się na opcję szybszą.

Różnica - opcja 2 szybsza o trochę ponad 30%.
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.