Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: XMLreader, problem z różnymi atrybutami
Forum PHP.pl > Forum > XML, AJAX
f4ll3ns3raf1n
Witam.

borykam się z problemem, mianowicie próbuję dobrać się do takiego pliku XML
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <teryt>
  3. <catalog name="TERC" type="all" date="2010-01-01">
  4. <row>
  5. <col name="WOJ">02</col>
  6. <col name="POW"/>
  7. <col name="GMI"/>
  8. <col name="RODZ"/>
  9. <col name="NAZWA">DOLNOŚLĄSKIE</col>
  10. <col name="NAZDOD">województwo</col>
  11. <col name="STAN_NA">2010-01-01</col>
  12. </row>
  13. <row>
  14. <col name="WOJ">02</col>
  15. <col name="POW">01</col>
  16. <col name="GMI"/>
  17. <col name="RODZ"/>
  18. <col name="NAZWA">bolesławiecki</col>
  19. <col name="NAZDOD">powiat</col>
  20. <col name="STAN_NA">2010-01-01</col>
  21. </row>
  22. </catalog>
  23. </teryt>


Chcę poprostu zrobić tablicę asocjacyjną, zawierającą wszystkie wpisy (tabela[index][wartosc_atrybutu_name] = wartosc)
i nie mogę sobie poradzić, o ile potrafię pobrać każdą wartość atrybutu NAME, to już nie potrafię całej wartości danego NODE-a pobrać (np "bolesławiecki").
siedzę od wczoraj, pomysłów mi brak, mogłby mi ktoś nasunąc jakieś pomysły na rozwiązanie?

index.php
  1. <?php
  2.  
  3. $reader = new XMLReader();
  4. $reader->open('TERC.xml');
  5. $count = 0;
  6.  
  7. while($reader->read())
  8. {
  9. // GDY rozpoczyna się ROW
  10. if($reader->nodeType == XMLReader::ELEMENT && $reader->name == "row")
  11. {
  12. $count++;
  13. }
  14.  
  15. // zbieranie atrybutów COL
  16. if($reader->nodeType == XMLReader::ELEMENT && $reader->name == "col")
  17. {
  18. if($reader->hasAttributes)
  19. {
  20. $tabela[$count][$reader->getAttribute("name")] = $reader->value;
  21. }
  22. //echo "<br />";
  23. }
  24. }
  25.  
  26. print_r($tabela);
  27. ?>



a efekt działań jest taki:
  1. <pre>
  2. (
  3. [1] => Array
  4. (
  5. [WOJ] =>
  6. [POW] =>
  7. [GMI] =>
  8. [RODZ] =>
  9. [NAZWA] =>
  10. [NAZDOD] =>
  11. [STAN_NA] =>
  12. )
  13.  
  14. [2] => Array
  15. (
  16. [WOJ] =>
  17. [POW] =>
  18. [GMI] =>
  19. [RODZ] =>
  20. [NAZWA] =>
  21. [NAZDOD] =>
  22. [STAN_NA] =>
  23. )
  24.  
  25. )
  26. </pre>



w dalszym ciągu nie znalazłem rozwiązania, ktoś ma pomysły? :-/
batman
Nie potrzebujesz w tym celu XMLReader. Wystarczy SimpleXML. Na szybkiego zrobiłem takie coś:
  1. $xml = new SimpleXMLElement($twoje_dane_z_pliku_xml);
  2. $count = 0;
  3. $out = array();
  4. foreach($xml->catalog[0]->row as $row) {
  5. foreach($row->col as $col) {
  6. if(!isset($out[$count])) {
  7. $out[$count] = array();
  8. }
  9. $out[$count][(string)$col['name']] = (string)$col;
  10. }
  11. $count++;
  12. }

W miejscu $twoje_dane_z_pliku_xml wstawiasz zmienną, która zawiera string z kodem XML. Jeśli wczytujesz dane z pliku, wystarczy, że zmienisz funkcję wczytującą te dane. Znajdziesz w manualu.
f4ll3ns3raf1n
batman, z tego co wyczytałem, przy plikach, których waga przekracza 50MB, SimpleXML może mieć problemy, czy to prawda?
tak czy inaczej - jutro spróbuję, dam znać jakie wyszły tego wyniki.

z góry dzięki za pomoc!
batman
Skoro mają to być duże pliki, to rzeczywiście XMLReader jest tutaj najlepszym wyborem. Spróbuj tego:
  1. $reader = new XMLReader();
  2. $reader->open('TERC.xml');
  3.  
  4. $counter = 0;
  5. $out = array();
  6. while($reader->read()) {
  7. if($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'row') {
  8. $out[$counter] = array();
  9.  
  10. while($reader->read()) {
  11. if($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'col') {
  12. $key = $reader->getAttribute('name');
  13. }
  14.  
  15. if($reader->nodeType == XMLReader::TEXT || $reader->nodeType == XMLReader::CDATA) {
  16. $out[$counter][$key] = $reader->value;
  17. }
  18.  
  19. if($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == 'row') {
  20. break;
  21. }
  22. }
  23.  
  24. $counter++;
  25. }
  26. }
f4ll3ns3raf1n
takie proste, a takie zarazem problemy stwarzało.
dokładnie o to chodziło! dzięki serdeczne!
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.