Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [XML][PHP]Przetwarzanie pliku txt na xml w php?
adek-
post 30.07.2011, 08:03:14
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


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ę.

Ten post edytował adek- 30.07.2011, 08:05:54
Go to the top of the page
+Quote Post
PawelC
post 30.07.2011, 10:27:02
Post #2





Grupa: Zarejestrowani
Postów: 1 173
Pomógł: 121
Dołączył: 24.09.2007
Skąd: Toruń

Ostrzeżenie: (0%)
-----


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

Ten post edytował ExPlOiT 30.07.2011, 11:15:10
Go to the top of the page
+Quote Post
adek-
post 30.07.2011, 13:26:57
Post #3





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
PawelC
post 30.07.2011, 13:34:23
Post #4





Grupa: Zarejestrowani
Postów: 1 173
Pomógł: 121
Dołączył: 24.09.2007
Skąd: Toruń

Ostrzeżenie: (0%)
-----


Możesz zrobić tak jak napisałeś. Pamiętaj, że czasami najprostsze rozwiązania są najlepsze wink.gif

Ten post edytował ExPlOiT 30.07.2011, 13:37:31
Go to the top of the page
+Quote Post
adek-
post 2.08.2011, 09:42:46
Post #5





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
kudlatypawelek
post 2.08.2011, 11:01:12
Post #6





Grupa: Zarejestrowani
Postów: 46
Pomógł: 5
Dołączył: 30.06.2011

Ostrzeżenie: (0%)
-----


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>';


Ten post edytował kudlatypawelek 2.08.2011, 11:04:20
Go to the top of the page
+Quote Post
adek-
post 2.08.2011, 11:58:16
Post #7





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


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"
Go to the top of the page
+Quote Post
kudlatypawelek
post 2.08.2011, 13:56:13
Post #8





Grupa: Zarejestrowani
Postów: 46
Pomógł: 5
Dołączył: 30.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
adek-
post 2.08.2011, 22:27:10
Post #9





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


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>
Go to the top of the page
+Quote Post
skowron-line
post 2.08.2011, 23:18:23
Post #10





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


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.  


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
adek-
post 4.08.2011, 10:16:09
Post #11





Grupa: Zarejestrowani
Postów: 124
Pomógł: 2
Dołączył: 19.04.2007
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


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


Ten post edytował adek- 4.08.2011, 10:16:42
Go to the top of the page
+Quote Post
skowron-line
post 4.08.2011, 10:19:29
Post #12





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

Ostrzeżenie: (0%)
-----


IF + http://www.php.net/manual/en/control-structures.continue.php


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 09:40