Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][XML] Wczytanie pliku XML na ekran
Forum PHP.pl > Forum > PHP
8_pasarzer_NOSTROMO
Proszę o pomoc z wczytaniem takiego XML, bo nie daje rady.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Rozkaz version="1" nazwaJednostki="Urząd Miasta" jednostka="2121" dataOd="2014-12-11T09:54:35.0" dataDo="2014-12-11T10:01:24.0" dataUtworzenia="2014-12-11T10:01:24.0" xmlns="http://www.on.pl" xmlns:ms="http://www.on.pl" xmlns:sl="http://www.on.pl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.on.pl">
  3. <ms:Rozkazy ID="0001">
  4.  
  5. <ms:Sygnatura wydzial="I" repertorium="C" nr="10" rok="2012"/></ms:Sygnatura>
  6. <ms:DataWpisu>2014-12-11</ms:DataWpisu>
  7. <ms:DataZarzadzenia>2014-12-11</ms:DataZarzadzenia>
  8.  
  9. <ms:Osoba ID="397082">
  10. <ms:Imie>Pingwin</ms:Imie>
  11. <ms:Nazwisko>Kowalski</ms:Nazwisko>
  12. <ms:Plec>Mężczyzna</ms:Plec>
  13. <ms:AdresyOsoby>
  14. <ms:AdresKorespondencyjny ulica="ul. Wielka" nr_domu="1" nr_mieszkania="33" miejscowosc="Wrocław" poczta="Wrocław" kod="53-333" wojewodztwo="dolnośląskie" kraj="Polska"/>
  15. </ms:AdresyOsoby>
  16. <ms:PESEL>71121212121</ms:PESEL>
  17. <ms:ImieOjca>Marian</ms:ImieOjca>
  18. <ms:DataUrodzenia>1971-12-12</ms:DataUrodzenia>
  19. <ms:MiejsceUrodzenia>Zieliniec</ms:MiejsceUrodzenia>
  20. <ms:Obywatelstwo>Polska</ms:Obywatelstwo>
  21. </ms:Osoba>
  22.  
  23. <ms:Uwagirozkazu>niebezpieczny</ms:Uwagirozkazu>
  24. <ms:Instytucja ID="737" ma_osobowosc_prawna="false" typ="Sąd"></ms:Instytucja>
  25. <ms:Sprawa>ważna</ms:Sprawa>
  26.  
  27. </ms:Rozkazy>
  28. </Rozkaz>


W jaki sposób wczytać taki plik by do zmiennej zaciągnąć np. PESEL osoby. W jakis sposób wyciągnąć wszystkie dane do zmiennych. Żaden sposób, który znalazłem w necie mi nie poszedł.
Proszę o pomoc.
nospor
http://php.net/manual/en/book.simplexml.php
A jak masz problem z konkretnym kodem, to podaj ten kod
8_pasarzer_NOSTROMO
A możesz napisać mi jak pobrać PESEL z tego XML. Sam sobie resztę wyciągnę.

Próbowałem tak:
  1. $xml = simplexml_load_file($plik);
  2. $oko= $xml->Rozkazy->PESEL;
  3. echo $oko;


I nic. Nie wiem jak odnieść się do konkretnego elementu. A plik mam nie z bazy danych lecz wysyłam go za pomocą formularza postem. Wcześniej wskazuje go z dysku. Bardzo dużo przykładow jest na funkcji simplexml_load_string($plik); a ja chce na file.
nospor
Cytat
Bardzo dużo przykładow jest na funkcji simplexml_load_string($plik); a ja chce na file.
Ale do danych w XML odwolujesz sie tak samo, niezaleznie czy to z pliku czy z tekstu...
Patrzyles w oogole czy wczytalo ci ten plik? Nie podajesz przypadkiem znowu złej ścieżki do niego jak ostatnio?
8_pasarzer_NOSTROMO
Pamiętasz widzę dobrze, ostatnio miałem biednego XML i dałęm sobie z nim rade. teraz mam kolosa :-)

  1. $xml = simplexml_load_file($plik);
  2.  
  3. $xml->getName();
  4.  
  5. // gdy dam print_r($xml). Wypali mi tablice Rozkaz tj. <Rozkaz version="1" nazwaJednostki="Urząd Miasta" jednostka="2121" dataOd="2014-12-11T09:54:35.0" dataDo="2014-12-11T10:01:24.0" dataUtworzenia="2014-12-11T10:01:24.0" xmlns="http://www.on.pl" xmlns:ms="http://www.on.pl" xmlns:sl="http://www.on.pl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.on.pl">
  6.  
  7. // Ale za chiny nie mogę dostać sie zniżej, do pozostałych konusów.
  8.  
  9. foreach ($xml->children() as $child)
  10. {echo $child;}
  11. // też nic


Kto jeszcze pomoże ?
Pyton_000
echo (string)$child;
8_pasarzer_NOSTROMO
Nic, pusto.
Pyton_000
Bo masz Namespace ustawione

  1. <?php
  2.  
  3. $xml = simplexml_load_file('./data.xml');
  4. $ns = $xml->getNamespaces(true);
  5. foreach ($xml->children($ns['ms']) as $child)
  6. {
  7. echo '<pre>'; var_dump($child); echo'</pre>';die(__FILE__ . ': '.__LINE__);
  8. }
8_pasarzer_NOSTROMO
Dzieki, coś ruszyło. Jakbyś był jeszcze tak miły, to w jaki sposób można odnieść się do konkretnego elementu tablicy $child. Np. Jak wypisać sam PESEL z tych danych.
robertpiaty
Poczytaj o xpath. A tu masz jak użyć xpath http://php.net/manual/en/simplexmlelement.xpath.php
8_pasarzer_NOSTROMO
możesz podać mi gotowe rozwiązanie jak wyciągnąć ten pesel. Bo w manualu gdzie mnie wysłałeś nie ma dokładnie takiego przykładu jak mój. Jutro w pracy oczywiście pokombinuje ale jakbyś był miły byłbym wdzięczny.
robertpiaty
Dokładnie tego XPATH-a nie pamiętam bo dawno nie używałem. Spróbuj coś w ten deseń:
  1. $xml = new SimpleXMLElement($string);
  2. $data = $xml->xpath('//ms:PESEL');


Dostajesz tablicę z obiektami SimpleXMLElement. Jak je wyświetlić to jużjest w tym linku co wcześniej podałem
8_pasarzer_NOSTROMO
Wiec dałem tak :

  1. foreach ($xml->children($ns['ms']) as $child)
  2. {
  3.  
  4. echo '<pre>'; var_dump($child); echo'</pre>';die(__FILE__ . ': '.__LINE__);
  5. }


I dostałem tablice $child, skróciłęm ją żeby nie była zbyt wielka.

  1. SimpleXMLElement Object ([Osoba] => SimpleXMLElement Object ( [Imie] => Pingwin [Nazwisko] => Kowalski [Plec] => Mężczyzna [AdresyOsoby] => SimpleXMLElement Object ( [AdresKorespondencyjny] => SimpleXMLElement Object ( ) ) [PESEL] => 71121212121[ImieOjca] => Marian [DataUrodzenia] => 1971-12-12 [MiejsceUrodzenia] => Zieliniec [Obywatelstwo] => Polska [AdresyInstytucji] => SimpleXMLElement Object ( [Adres] => SimpleXMLElement Object ( ) ) ) [Dokument] => SimpleXMLElement Object ( [DataSporzadzenia] => 2014-12-11 [Nazwa] => Rozkaz)


Próbowałem dostać sie do elementów poprzez : $data = $xml->xpath('//ms:PESEL'); i nie działa. Jakby ktoś mi pomógł jak odnosić się do poszczególnych elementów tej tablicy i ewentualnie do ich atrybutów jeśli są np.

  1. <ms:Sygnatura wydzial="I" repertorium="C" nr="10" rok="2012"/></ms:Sygnatura>
Pyton_000
  1. echo '<pre>'; print_r((string)$child->Osoba->PESEL); echo'</pre>';die(__FILE__ . ': '.__LINE__);
8_pasarzer_NOSTROMO
Dzieki Pyton, jestes wielki!

A podpowiedz mi jeszcze jak dobrać się do tego typu argumentów

  1. <ms:Rozkazy ID="0001">
  2. <ms:Sygnatura wydzial="I" repertorium="C" nr="10" rok="2012"/>


Chodzi mi o ID="0001" oraz wydzial="I", repetytorium="C" itp.
Pyton_000
  1. echo (string)$xml->Sygnaturka['wydzial'];
8_pasarzer_NOSTROMO
Nie poszło.

Przy var_dump($child) pokazuje taki zapis.

  1. object (SimpleXMLelement)#4 (19)
  2. {
  3. ["Sygnatura"]=>
  4. }
Pyton_000
Pokaż kod...
8_pasarzer_NOSTROMO
Kod

XML, skróciłem dla dobra pokazu

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <DoSynchronizacji version="1" nazwaJednostki="xxx" jednostka="xx" dataOd="2014-12-11T09:54:35.0" dataDo="2014-12-11T10:01:24.0" dataUtworzenia="2014-12-11T10:01:24.0" xmlns="http://www.o9.pl" xmlns:ms="http://www.ms.gov.pl" xmlns:sl="http://www.o9.pl" xmlns:xsi="http://www.w9.org" xsi:schemaLocation="http://www.o11.pl">
  3. <ms:Rozkaz ID="00018814-DEAD-FEBA-0002-00000000000F">
  4. <ms:Sygnatura wydzial="I" repertorium="C" nr="10" rok="2014"/>
  5. <ms:Osoba ID="397082">
  6. <ms:AdresyOsoby>
  7. <ms:AdresKorespondencyjny ulica="ul. Wielka" nr_domu="1" nr_mieszkania="33" miejscowosc="Wrocław" poczta="Wrocław" kod="53-333" wojewodztwo="dolnośląskie" kraj="Polska"/>
  8. </ms:AdresyOsoby>
  9. </ms:Osoba>
  10. </ms:Rozkaz>
  11. </DoSynchronizacji>



PHP
  1. $xml = simplexml_load_file($nazwa2);
  2. $ns = $xml->getNamespaces(true);
  3.  
  4.  
  5. foreach ($xml->children($ns['ms']) as $child)
  6. {
  7.  
  8. // tu nie wypluwa nic
  9. echo "Oko : ".$oko=((string)$xml->Sygnatura['wydzial']);
  10.  
  11. // Tutaj jest ok. W całym XML występują te pozycje. W przykładzie wyżej nie.
  12. echo"<br>";
  13. $nazwisko=((string)$child->Osoba->Nazwisko);
  14. echo"Nazwisko : ".$nazwisko=iconv('utf-8','iso-8859-2', $nazwisko);
  15. echo"<br>";
  16. echo"PESEL : ".$pesel=((string)$child->Osoba->PESEL);
  17. echo"<br>";
  18. echo'<pre>'; var_dump($child); echo'</pre>';
  19. }
Pyton_000
  1. ((string)$child->Sygnatura->attributes()['rok']);
8_pasarzer_NOSTROMO

  1.  
  2. ((string)$child->Sygnatura->attributes()['rok']);
  3. // daje
  4. Parse error: syntax error, unexpected '[' in /var/www/wczytaj.php on line 109
  5.  
  6.  
  7. // Z kolei tak
  8. ((string)$child->Sygnatura->attributes());
  9. // daje wynik : I
  10. // Czyli pobiera pierwszą wartość z tablicy atrybutów (I, C, 10, 2014)
Pyton_000
No to przypisz wynik attributes() do zmiennej (bez rzutowania na string)
i wyciągnij jak z tablicy normlanie (tu już chyba z rzutowaniem)

To co Ci podałem zadziała na php >=5.5 zdaje się
8_pasarzer_NOSTROMO
Zrobiłem tak i działa, wklejam dla potomnych :

  1. $sygnatura = ($child->Sygnatura->attributes());
  2.  
  3. echo "Wydział : ".$sygnatura['wydzial'];
  4. echo "<br>repertorium : ".$sygnatura['repertorium'];
  5. echo "<br>nr : ".$sygnatura['nr'];
  6. echo "<br>rok : ".$sygnatura['rok'];


Pyton jestem Ci bardzo wdzięczny. Dopiero zaczynam z XML więc wybacz że może i głupoty pisałem, robiłem.

Pomógł x10 !
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.