Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XML][PHP]Przetwarzanie pliku txt na xml w php?
Forum PHP.pl > Forum > Przedszkole
adek-
Witam, zabawiam się w przetwarzanie pliku txt na xml, czy da się to zrobić w php? szukałem w google, to mi się jakieś konwertery pokazywały za pomocą wyślij plik my Ci zrobimy ;/ Tłumaczę o co mi dokładnie chodzi...

plik txt zawiera np
  1. XXX#100#264.00#280.00
  2. ZZZ#100#385.00#401.00
  3. YYY#100#429.00#446.00


a chciał bym, aby się konwertował do xml w taki sposób:
  1. <data>
  2. <tabela timeout="15">
  3. <item symbol="XXX" imgsrc="images/xxx.png" jednostka="100" dane="264.00" dane2="280.00"><![CDATA[nazwa własna]]></item>
  4. <item symbol="YYY" imgsrc="images/yyy.png" jednostka="100" dane="385.00" dane2="401.00"><![CDATA[nazwa własna2]]></item>
  5. <item symbol="ZZZ" imgsrc="images/zzz.png" jednostka="100" dane="429.00" dane2="446.00"><![CDATA[nazwa własna3]]></item>
  6. </tabela>
  7. </data>


Po pierwsze nie wiem czy w php się to da zrobić, po drugie dochodzą imgsrc i srodek itemu jako dane ktorych nie ma w pliku txt i też nie wiem czy da się to jakoś przetworzyć... chyba że istnieje taka opcja jak, konwersja z txt na xml, a później komparowanie z drugim xml, który ma zapisane brakuące dane i będzie doklejał? proszę o poradę za czym mam szukać i jakie rozwiązania mogę teoretycznie wykorzystać.

np drugi xml zawierał by brakujące dane i parówał się albo kolejnością, bo jest stała, albo np po symbolu...
  1. <item symbol="XXX" imgsrc="images/xxx.png"><![CDATA[nazwa własna]]></item>


Z góry dziękuję.
PawelC
1. Wczytujesz poprzez pętle linie po linii z pliku txt
2. Rozbijasz wczytaną linię explode, względem #
3. Wstawiasz dane w odpowiednie miejsca smile.gif

Wbrew pozorom nie jest to skomplikowane, ale zaraz sam to sprawdzę wink.gif

  1. <?
  2. $file=file('dane.txt');
  3.  
  4. #Start XML
  5. echo '<data><tabela timeout="15">';
  6.  
  7. #Loading data from a TXT file to XML
  8. foreach ($file as $data) {
  9. $line=explode("#",$data);
  10. echo '<item symbol="'.$line[0].'" imgsrc="images/'.strtolower($line[0]).'.png" jednostka="'.$line[1].'" dane="'.$line[2].'" dane2="'.$line[3].'"><![CDATA[nazwa własna]]></item>';
  11. }
  12.  
  13. #End of the XML data
  14. echo '</tabela></data>';
  15. ?>

daje taki efekt:
  1. <data>
  2. <tabela timeout="15">
  3. <item symbol="XXX" imgsrc="images/xxx.png" jednostka="100" dane="264.00" dane2="280.00"><![CDATA[nazwa własna]]></item>
  4. <item symbol="ZZZ" imgsrc="images/zzz.png" jednostka="100" dane="385.00" dane2="401.00"><![CDATA[nazwa własna]]></item>
  5. <item symbol="YYY" imgsrc="images/yyy.png" jednostka="100" dane="429.00" dane2="446.00"><![CDATA[nazwa własna]]></item>
  6. </tabela>
  7. </data>


Odnośnie pliku XML tego drugiego, jeżeli i w jednym i drugim jest taki symbol, to możesz wyszukiwać właśnie względem niego smile.gif Myślę, że wystarczająco Ciebie nakierowałem wink.gif
adek-
ExPlOiT wystarczająco? Ty odwaliłeś za mnie praktycznie całą robotę smile.gif Wielkie dziękuję i daje pomógł... mam tylko jeszcze takie pytanie, bo zamiast robić porównywanie xmla w celu dodawania nazwy własnej, w zasadzie nie wiem, czy nie dało by się zrobić tak, że podczas explode będzie sprawdzał że np symbol XXX to od razu przetważał go w "nazwa własna XXX" i wstawiał w CDATA

np
  1. foreach ($file as $data) {
  2. $line=explode("#",$data);
  3.  
  4. if ($line[0]=="XXX") { $nazwaw="nazwa własna XXX" };
  5. if ($line[1]=="YYY") { $nazwaw="nazwa własna YYY" };
  6.  
  7. echo '<item symbol="'.$line[0].'" imgsrc="images/'.strtolower($line[0]).'.png" jednostka="'.$line[1].'" dane="'.$line[2].'" dane2="'.$line[3].'"><![CDATA[$nazwaw]]></item>';
  8. }

bo w zasadzie będzie stałe około 10 linii które będą raczej niezmienne więc można im przypisać dla ułatwienia 0,1,2, chyba że z automatu zrobić to jest łatwiej

PawelC
Możesz zrobić tak jak napisałeś. Pamiętaj, że czasami najprostsze rozwiązania są najlepsze wink.gif
adek-
Wybaczcie, że kontynuuje w tym samym artykule, ale w zasadzie wątek dotyczy dalej tego samego kodu. Jeśli mam stworzyć nowy wątek, to proszę o info.

Mianowicie mam problem z zapisem tego do pliku. Robiąc tak na samym końcu kodu:
  1. file_put_contents('CZW-andyxml.xml', $line);

wyrzuca mi xml'a z treścią:
  1. 9001115.00135.00


Natomiast jeśli zrobię sobię nieco inaczej np:
  1. #Start XML
  2. $dane='<?xml version="1.0" encoding="utf-8"?>
  3. <data>
  4. <tabela timeout="15">';
  5. foreach ($file as $data) {
  6. $line=explode("#",$data);
  7. '<item symbol="'.$line[0].'" imgsrc="images/'.strtolower($line[0]).'.png" jednostka="'.$line[1].'" dane="'.$line[2].'" dane2="'.$line[3].'"><![CDATA[$nazwaw]]></item>';
  8. }
  9. '</tabela>
  10. </data>';
  11.  
  12. $wp=fopen('serwis.xml', 'w+');
  13. fwrite($wp, $dane);
  14. fclose($wp);
  15. ?>

to zapisze mi xml'a w postaci:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <data>
  3. <tabela timeout="15">

i ucina tam gdzie miałem oczywiście znak kończenia ;

Jak to obejść i którą metodę szukać na internecie do nauczenia się? PS jeszcze będę miał jeden biznes,ale po kolei i na spokojnie smile.gif
kudlatypawelek
Działa tak jak to zaprogramowałeś. .Skoro zapisujesz do pliku wartość zmiennej $dane to musisz najpierw w pętli podoklejać wszystkie linie i dopiero na końcu wrzucić to do pliku.

  1. $myLine = '';
  2. $dane='<?xml version="1.0" encoding="utf-8"?>
  3. <data>
  4.  
  5. <tabela timeout="15">';
  6.  
  7. foreach ($file as $data) {
  8.  
  9. $line=explode("#",$data);
  10. $myLine .= '<item symbol="'.$line[0].'" imgsrc="images/'.strtolower($line[0]).'.png" jednostka="'.$line[1].'" dane="'.$line[2].'" dane2="'.$line[3].'"><![CDATA[$nazwaw]]></item>';
  11.  
  12. }
  13. $dane .= $myLine;
  14. $dane .= '</tabela></data>';
adek-
Super, działa tylko jeszcze jak byś mi wytłumaczył jak to funkcjonuje w praktyce...

Na początku zrobiłeś pustą funkcję $myLine = ''; tak?
a następnie przypisałeś dane
$myLine .= '<item symbol="'.$line[0].'" imgsrc="images/'.strtolower($line[0]).'.png" jednostka="'.$line[1].'" dane="'.$line[2].'" dane2="'.$line[3].'"><![CDATA[$nazwaw]]></item>';
i wyrzuciłeś za pomocą $dane .= $myLine;?

ogólnie pomijając fakt, że ja tam troszkę źle chciałem to wyświetlić, to czy nie wyświetliło by tych danych bez przypisywania ich zmiennej $myLine? Pytam tylko z ciekawości.

I skoro to jest już rozwiązane, to mam pytanie odnośnie wcześniejszego rozpoznawania "XXX" i zamiany go na "nazwa własna XXX", YYY i nazwa własna YYY to muszę przyznać, że tak jak chciałem to zrobić na sztywno i samo postawienie warunku if
  1. if ($line[0] == 'XXX') { $nazwaw = 'nazwa wlasna xxx'; }
  2. elseif ($line[1] == 'YYY') { $nazwaw = 'nazwa wlasna yyy'; }
  3. elseif ($line[2] == 'ZZZ') { $nazwaw = 'nazwa wlasna zzz'; }

nie skutkuje bo przy wyświetlaniu tego
  1. <![CDATA['.$nazwaw.']]>

pozostaje puste pole w XML'u. Błędnie postawiłem warunek, czy źle to chcę wyświetlać?

Ogólnie rzecz biorąc przypisanie takie na sztywno też nie jest zadowalające, bo jęśli się zmieni kolejność to wszystko szlak trafi i jeśli już będę potrafił tymczasowo przypisać to na sztywno to w między czasie zastanawiam się nad próbą automatycznego rozpoznawania np za pomocą tablicy.

Zastanawiam się czy może to wypalić w ten sposób jak teoretyzuje...
  1. //Inicjacja Tablicy Indeksowanej Asocjacyjnie
  2. $tablica = array ( "XXX" => "nazwa własna xxx",
  3. "YYY" => "nazwa własna yyy",
  4. "ZZZ" => "nazwa własna zzz",
  5. "CCC" => "nazwa własna www",
  6. itd....),

i jakoś jej wywołanie, aby sobie przypisała znalezione wartości, w przypadku natrafienia na "XXX" wstawi "nazwa własna xxx"
kudlatypawelek
myślę, że tu pomocne mogą być wyrażenia regularne, albo jeżeli ciągi wejściowe są w miarę okreslone z dwóch tablic (wejściowej i wyjściowej) + str_replace(). Co do Twojego pierwszego pytania to owszem do $dane mogłeś w foreachu przypisywać całe linie $dane .= "linia", ale dzięki zastosowaniu oddzielnej zmiennej mamy porządek biggrin.gif
adek-
Tak to będą stałe i bardzo proste ciągi wejściowe, a dokładniej walutowe np. jeśli będzie USD to ma się pokazać dolar amerykański itd wink.gif Tylko czemu mi to nie działa, tzn działa, ale pokazuje o jedno przesunięte w dół?
gdy mam tak:
  1.  
  2. foreach ($file as $data) {
  3. if ($line[0] == 'USD') { $nazwaw = 'dolar amerykański'; }
  4. elseif ($line[0] == 'EUR') { $nazwaw = 'euro'; }
  5. elseif ($line[0] == 'GBP') { $nazwaw = 'funt szterling'; }
  6. else { }
  7. $line=explode("#",$data);
  8. $myLine .= '<item symbol="'.$line[0].'" imgsrc="images/'.strtolower($line[0]).'.png" jednostka="'.$line[1].'" dane="'.$line[2].'" dane2="'.$line[3].'"><![CDATA['.$nazwaw.']]></item>
  9. ';


to mi wyrzuca plik xml przesuniety o jeden w dol czyli tam gdzie ejst USD to nie wyswietli nic, a tam gdzie EUR wysweitli dolar amerykanski
  1. <item symbol="USD" imgsrc="images/usd.png" jednostka="100" dane="264.00" dane2="280.00"><![CDATA[]]></item>
  2. <item symbol="EUR" imgsrc="images/eur.png" jednostka="100" dane="385.00" dane2="401.00"><![CDATA[dolar amerykański]]></item>
  3. <item symbol="GBP" imgsrc="images/gbp.png" jednostka="100" dane="429.00" dane2="446.00"><![CDATA[euro]]></item>
skowron-line
Popatrz na poniższy kod, skup się, weź 10 wdechów i zastanów się czy w dobrym miejscu exploda użyłeś
  1.  
  2. foreach ($file as $data) {
  3. if ($line[0] == 'USD') { $nazwaw = 'dolar amerykański'; }
  4. elseif ($line[0] == 'EUR') { $nazwaw = 'euro'; }
  5. elseif ($line[0] == 'GBP') { $nazwaw = 'funt szterling'; }
  6. else { }
  7. $line=explode("#",$data);
  8. $myLine .= '<item symbol="'.$line[0].'" imgsrc="images/'.strtolower($line[0]).'.png" jednostka="'.$line[1].'" dane="'.$line[2].'" dane2="'.$line[3].'"><![CDATA['.$nazwaw.']]></item>
  9. ';
  10.  
adek-
Hmm nawet nie wiedziałem, że takie coś może być problemem! W każdym bądź razie dzięki chłopaki, na razie wszystko z czym miałem problemy jest rozwiązane... sogi poszły już do Was... chociaż pewnie jeszcze nie raz będziecie mieli okazję pomóc :-)

------------ edited 04.08.2011 ----------
A w zasadzie jest jeszcze taka możliwość, żeby np jakiejś linijki nie wyrzucało?
np żeby mi wykluczyło trzecią linijkę? Robi się to na zasadzie pomijjania linii x, czy na zasadzie jak zobaczysz YYY to nie wyrzucaj? Za czym mam szukać i jakimi zmiennymi do zrobienia tego?
  1. XXX#100#264.00#280.00
  2. ZZZ#100#385.00#401.00
  3. YYY#100#429.00#446.00
skowron-line
IF + http://www.php.net/manual/en/control-structures.continue.php
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.