Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [xml] parsowanie
Forum PHP.pl > Forum > XML, AJAX
voytass
witam,

Jestem poczatkujacy w tematyce XML. chcialbym uzystak kilka rad i wskazowek.
posiadam plik XML o oryginalnej strukturze.
chcialbym wyciagnac dane z XMLa i zrobic input do mysql.
jak to zrobic? czy musze sam napisac parser do takiego oryginalnego XMLa?
czy tez moge skorzystac a jakiegos skryptu, w ktorym sam okreslam z jakich znacznikow mam wyciagac dane?
LBO
najprosciej: simplexml" title="Zobacz w manualu php" target="_manual
voytass
SimpleXML wymaga PHP5 a ja musze to zrobic na PHP4. jest jakis odpowiednik SimpleXML dla PHP4?
LBO
rozszerzenie DOM" title="Zobacz w manualu php" target="_manual jest wbudowane w jadro php
voytass
Tzn. ze zadziała, bo nie wiem jak mam traktowac tą Twoja odpowiedź
LBO
to znaczy, ze kazda dystrybucja php , obsluguje DOM defaultowo...

edit: sorki za tamten blad, mogl wprowadzic zamieszanie
voytass
tzn. ze musze napisac caly parser sam jesli chce wydobywac wartosc okreslonych znacznikow?
Zbłąkany
Masz do wyboru: DOM XML lub XML Parser jak nie masz dostępu do żadnego z nich to niestety musisz napisać samemu smile.gif
voytass
witam,

Skorzystam raczej z XML Parser bo DOM mi nie dziala (chyb anie jest wlaczony na moim serwerze - serwer nazwa.pl).
jak powinienem przebudowac ten przykład ponizej, aby móc dodac dane z XML do bazy mysql?
  1. <?php
  2. $file = "data.xml";
  3. $depth = array();
  4.  
  5. function startElement($parser, $name, $attrs)
  6. {
  7.  global $depth;
  8.  for ($i = 0; $i < $depth[$parser]; $i++) {
  9.  echo " ";
  10.  }
  11.  echo "$name\n";
  12.  $depth[$parser]++;
  13. }
  14.  
  15. function endElement($parser, $name)
  16. {
  17.  global $depth;
  18.  $depth[$parser]--;
  19. }
  20.  
  21. $xml_parser = xml_parser_create();
  22. xml_set_element_handler($xml_parser, "startElement", "endElement");
  23. if (!($fp = fopen($file, "r"))) {
  24.  die("could not open XML input");
  25. }
  26.  
  27. while ($data = fread($fp, 4096)) {
  28.  if (!xml_parse($xml_parser, $data, feof($fp))) {
  29.  die(sprintf("XML error: %s at line %d",
  30.  xml_error_string(xml_get_error_code($xml_parser)),
  31.  xml_get_current_line_number($xml_parser)));
  32.  }
  33. }
  34. xml_parser_free($xml_parser);
  35. ?> 



oto XML (jeden rekord - czy jedn aencja - nie wiem czy dobrze to nazwywam)
  1. <?xml version="1.0" encoding="ISO-8859-2"?>
  2. <Transfer>
  3. <AdvData Action="" ID="" ExpDate="" InsDate="">
  4. <ContactData Firma="" RegionId="" City="" Email="" Kategoria=""/>
  5. <Introduction><![CDATA[]]></Introduction>
  6. <Post><![CDATA[]]></Post>
  7. <Subpost><![CDATA[]]></Subpost>
  8. <Description><![CDATA[]]></Description>
  9. <Requirements><![CDATA[]]></Requirements>
  10. <Offer><![CDATA[]]></Offer>
  11. <Procedure><![CDATA[]]></Procedure>
  12. <Address><![CDATA[]]></Address>
  13. <e-mail><![CDATA[]]></e-mail>
  14. <AddInfo><![CDATA[]]></AddInfo>
  15. <JobTitle></JobTitle>
  16. <URL></URL>
  17. </AdvData>
  18. ...i tu kolejny zestaw znaczikjow AdvData i danych..
  19. </Transfer>



prosze o wskazowki i uwagi jak podejsc do tego tematu przenoszenia danych z XMLa do bazy danych.
wrzasq
coz, ten przyklad ktory podales jedynie wypisuje dane. musisz stowrzyc mechanizm zapisujacy dane przekazywane do startElement() w odpowiedniej hierarchi - mozesz napisac prosta klase - nazwa znacznika, tablica argumentow i referencja do "dzieci". chociaz to dosc kompleksowe rozwiazanie (jak na XML ktory podales) - jezeli calosc pliku XML wyglada tak jak napisales (czyli nie ma dalszego zagniezdzania) to wystarczy ze stworzysz sobie tablice gdzie dla kazdego elementu (ktory przechwyci ci startElement()) bedziesz zapisywal jego atrybuty (jezeli chcesz zawartosc znacznika rowniez zapisaywc, musisz jeszcze napisac obsluge xml_set_character_data_handler()). i jedynie zwiekszaj indeks tablicy po nastepnym wystapieniu AdvData.

no a nastepnie juz proste zapytania SQL wstawiajac w nie dane zapisane w tablicy (wzglednie obiekcie jesli sie na nie zdecydujesz).
voytass
witam,

dzieki za naprowadzenie, wlasnie siedze i probuje zrozumiec co to wszystko znaczy co napisales smile.gif czy moglbys podac jakis przyklad?

rozumiem, ze wartosci znaczikow mam zapisywac do tablicy a potem wywolac 'insert' do bazy?

przebudowalem troche skrypt:
  1. <?php
  2. $file = "test.xml";
  3. $map_array = array(
  4.  "BOLD" => "B",
  5.  "EMPHASIS" => "I",
  6.  "LITERAL" => "TT"
  7. );
  8. #$praca = array();
  9.  
  10. function startElement($parser, $name, $attrs)
  11. {
  12.  global $map_array, $praca, $i;
  13.  #if (isset($map_array[$name])) {
  14.  # echo "<$map_array[$name]>";
  15.  #}
  16. if ($name == "ADVDATA"){
  17. $i++;
  18. foreach ($attrs as $key=>$val) {
  19. $praca[$i][$key] = $val;
  20. }
  21. } 
  22. #print $name;
  23. if ($name == "CONTACTDATA"){
  24. foreach ($attrs as $key=>$val) {
  25. $praca[$i][$key] = $val;
  26. }
  27. }
  28. if ($name == "INTRODUCTION"){
  29. $praca[$i][$name] = a jak tutaj?questionmark.gifquestionmark.gif?;
  30. }
  31. if ($name == "POST"){
  32. $praca[$i][$name] = a jak tutaj?questionmark.gifquestionmark.gif?;
  33. }
  34. ...
  35.  
  36. #  print $name."<br/>";
  37. #  print "<pre>";
  38. #  print_r($attrs);
  39. #  print "</pre>";
  40.  
  41. }
  42.  
  43. function endElement($parser, $name)
  44. {
  45.  global $map_array;
  46.  if (isset($map_array[$name])) {
  47.  echo "</$map_array[$name]>";
  48.  }
  49. }
  50.  
  51. function characterData($parser, $data)
  52. {
  53. }
  54.  
  55. $xml_parser = xml_parser_create();
  56. // use case-folding so we are sure to find the tag in $map_array
  57. xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
  58. xml_set_element_handler($xml_parser, "startElement", "endElement");
  59. xml_set_character_data_handler($parser, "characterData")
  60. if (!($fp = fopen($file, "r"))) {
  61.  die("could not open XML input");
  62. }
  63.  
  64. while ($data = fread($fp, 4096)) {
  65.  if (!xml_parse($xml_parser, $data, feof($fp))) {
  66.  die(sprintf("XML error: %s at line %d",
  67.  xml_error_string(xml_get_error_code($xml_parser)),
  68.  xml_get_current_line_number($xml_parser)));
  69.  }
  70. }
  71. xml_parser_free($xml_parser);
  72.  
  73.  print "<pre>";
  74.  print_r($praca);
  75.  print "</pre>";
  76. ?> 


wartosci atrybutow moge zapisac do tablicy $praca
A co z tymi znacznikami ktore nie maja znacznikow jak je wpisac do tablicy $praca?
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.