Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Simplexml odczyt wartości
Forum PHP.pl > Forum > PHP
tomaszh
  1. <abc>
  2.   <rows id="12">ala</rows>
  3.   <rows id="56">ola</rows>
  4. </abc>

W jaki sposób mogę za pomocą simplexml odczytać wartość o id 12, czyli "ala"?

Niestety poniższe sposoby nie pomagają, odczytują tylko wartość id czyli 12.
  1. <?php
  2. foreach($abc->rows as $rows) {
  3. echo $rows['id'];
  4. echo $rows['id']=12;
  5. }
  6. ?>
skowron-line
SimpleXML
Przykład 1
  1. <?php
  2. $string = <<<XML
  3. <a xmlns:b>
  4.  <foo name="one" game="lonely">1</foo>
  5. </a>
  6. XML;
  7.  
  8. $xml = simplexml_load_string($string);
  9. foreach($xml->foo[0]->attributes() as $a => $b) {
  10.    echo $a,'="',$b,"\"\n";
  11. }
  12. ?>

Kod
name="one"
game="lonely"
peter_zan
Polecam potrenować obsługę xml w php...

Spróbuj:
  1. <?php
  2. foreach($xml->rows as $rows) {
  3.    echo $rows['id'].": "; //odnosi się to atrybutu
  4.    echo $rows."<br>"; //odnosi się do wartości
  5. }
  6. ?>


pzdr
PZ
tomaszh
@skowron-line, w twoim przykładzie odczyt "name" i "game" jest prosty, mi chodzi jak odczytać w twoim przykładzie liczbę 1.
Czy ktoś ma jakiś pomysł, myślałem że to jest podstawowa funkcja simplexml.
skowron-line
http://www.phpfever.com/simplexml-tutorial-part1.html
Dlaczego w google nie poszukałeś skoro wiesz że chodzi o simpleXML.
peter_zan
Cytat(tomaszh @ 4.06.2009, 08:26:36 ) *
@skowron-line, w twoim przykładzie odczyt "name" i "game" jest prosty, mi chodzi jak odczytać w twoim przykładzie liczbę 1.
Czy ktoś ma jakiś pomysł, myślałem że to jest podstawowa funkcja simplexml.


A spróbowałeś mój kod??

Dostałeś gotowe rozwiązanie i nawet nie spróbowałeś...
tomaszh
@peter_zan, w twoim przypadku wyświetlana jest wartość o kolejnym id, tzn. jeżeli odczytam id=1, następnie id=2, itd. nie będą mógł już odczytać poprzednich wartości id. Potrzebuje polecenia które porówna np. wartość id=1 z id=12, dlatego też musiałoby to być coś w stylu $rows['id']=12
peter_zan
Aha, czyli chcesz przeszukać xml'a.
Gotowiec:
  1. <?php
  2. $string = <<<XML
  3. <abc>
  4.  <rows id="10">ala</rows>
  5.  <rows id="11">ala</rows>
  6.  <rows id="12">ola</rows>
  7.  <rows id="13">ola</rows>
  8.  <rows id="14">ola1</rows>
  9.  
  10. </abc>
  11. XML;
  12.  
  13. $xml = simplexml_load_string($string);
  14.  
  15. function compare($id1,$id2) {
  16.    global $xml;
  17.    $values = array();
  18.    foreach($xml->rows as $rows) {
  19.        if (($rows['id'] == $id1) || ($rows['id'] == $id2)) {
  20.            $values[] = (string)$rows;
  21.        }
  22.    }
  23.    return $values;
  24. }
  25.  
  26. $values = compare(10,12);
  27. if ($values[0] == $values[1]) { echo "Takie same"; }
  28. if ($values[0] != $values[1]) { echo "Różne"; }
  29. echo "<hr>";
  30. $values = compare(10,11);
  31. if ($values[0] == $values[1]) { echo "Takie same"; }
  32. if ($values[0] != $values[1]) { echo "Różne"; }
  33. ?>


Albo napisz jeszcze DOKŁADNIE co chcesz osiągnąć?

pzdr
PZ
tomaszh
tylko że nie odczytasz w ten sposób wartości, np. nie porównasz id=15 z id=5. Ponieważ id=5 już nie odczytasz przy takim zapisie w xml-u.
Przykład:
  1. <?php
  2. if($rows['id']==36) echo $rows; // odczyt wartości o id=36
  3. if($rows['id']==37) echo $rows; // odczyt wartości o id=37
  4. if($rows['id']==38) echo $rows; // odczyt wartości o id=38
  5.  
  6. if($rows['id']==36) echo $rows; // nie można już odczytać wartości o id=31
  7. ?>
skowron-line
A co rozumiesz przez porównywanie chcesz sprawdzić która wartość jest większa questionmark.gif czy jak bo nie kumam teraz questionmark.gif
tomaszh
Nawet jeżeli mam zwykły warunek
  1. <?php
  2. foreach($abc->rows as $rows) {
  3. if($rows['id']==12) {
  4. if($rows=="ala") echo "tak"; // poprawnie
  5. }
  6. if($rows['id']==56) {
  7. if($rows=="ola") echo "tak"; // poprawnie
  8. }
  9. if($rows['id']==12) {
  10. if($rows=="ola") echo "tak"; // nie pobiera
  11. }
  12. }
  13. ?>

A chciałbym aby mógł pobrać w każdym miejscu pętli dany id.
peter_zan
To chyba pętla w pętli, XML leci 'po kolei'. W XML musisz się odnosić do 'dzieci' a obejściem jest taka funkcja

  1. <?php
  2. $string = <<<XML
  3. <abc>
  4.  <rows id="10">ala</rows>
  5.  <rows id="11">ala</rows>
  6.  <rows id="12">ola</rows>
  7.  <rows id="13">ola</rows>
  8.  <rows id="14">ola1</rows>
  9.  
  10. </abc>
  11. XML;
  12.  
  13. $xml = simplexml_load_string($string);
  14.  
  15. function read($id) {
  16.    global $xml;
  17.    foreach($xml->rows as $rows) {
  18.        if ($rows['id'] == $id) {
  19.            $value = (string)$rows;
  20.            break;
  21.        }
  22.    }
  23.    return $value;
  24. }
  25. echo read(10)." ".read(13);
  26. //odwołuj się do funkcji read, kiedy chcesz coś gdzieś porównać... daje Ci ona wartość danego ID, kiedy chcesz
  27. ?>


Jeśli to nie pomoże to nie wiem już naprawdę o co biega... : sciana.gif

PZ
tomaszh
@peter_zan, dzięki, po niewielkich modyfikacjach działa, tylko że przy każdym wywołaniu funkcji read(), rozpoczyna odczyt xml-a od początku(ale przy takim zapisie chyba nie ma innego wyjścia), przy dużej ilości "paczek" xml(kilkanaście tysięcy) może być problem z obciążeniem serwera i czasem wykonania. Zobaczymy jak będzie to wyglądało w praktyce. Jeszcze raz, dzięki za szybką pomoc.
peter_zan
Wiesz co, tak sobie myślę, że przecież xpath ma takie właściwości jakie potrzebujesz smile.gif
Spróbuj tak:
  1. <?php
  2. $value = $xml->xpath('//rows[@id=13]');
  3. echo $value[0];
  4. $value = $xml->xpath('//rows[@id=11]');
  5. echo $value[0];
  6. ?>


Może będzie szybciej winksmiley.jpg

EDIT:
Nie uwierzycie, ale moja funkcja jest szybsza od xpath'a exclamation.gif
O ponad połowę przy 100000 rekordach smile.gif

Rkingsmiley.png

pzdr
PZ
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.