Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][XML][PHP]Wczytanie pliku
Forum PHP.pl > Forum > Przedszkole
madsix
Witam mam taki problem mam plik xml o takiej strukturze to jest tylko przykład struktury

Kod
<?xml version="1.0" encoding="utf-8" ?>
<katalog>(główny węzeł tzw. Korzeń)
<GrupyTowarowe>(rozpoczyna się lista grup)
<GrupaGlowna id="SIE"(id grupy) nazwa="Sieci"(nazwa grupy)> (grupa główna)
<PodGrupy>(rozpoczyna się lista podgrup)
<PodGrupa id="SIE-BAK"(id podgrupy) nazwa="AccesPoint"(nazwa podgrupy) />
</PodGrupy> (zamkniecie listy podgrup)
</GrupaGlowna> (zamkniecie grupy)
</GrupyTowarowe> (zamkniecie listy grup towarowych)
<producenci>(lista producentów)
<producent id="TEL"(id producenta) nazwa="Telegaertner" (nazwa producenta) />
<producent id="TER" nazwa="TERRATEC" />
<producent id="THE" nazwa="Thermaltake" />
<producent id="XPE" nazwa="XpertVision" />
<producent id="YAD" nazwa="Yamada" />
</producenci> (zamkniecie listy producentów)
<produkty> (lista produktów)
<produkt id="SIEEDIBAK0006" (kod produktu)
nazwa="EDIMAX (EW-7203APG) Acces Point 54Mbps 802.11g, 1xLAN" (nazwa produktu)
producent="EDI" (kod producenta)
grupa="SIE-BAK"(kod grupy)
cena_netto="153.03"(cena netto)
vat="23"(stawka podatku  vat)
cena_sugerowana="190.00"[Parametr opcjonalny]( sugerowana cena detaliczna z VAT)
data="2005-02-25"(data dodania produktu do oferty action)  gwarancja="G024M"(oznaczenie czasu gwarancji)
dostepny="25"(obecny stan magazynowy dla liczby <= 30 lub napis ponad 30 dla liczby >30)
na_zamowienie="N"(produkt na zamówienie)
oferta_specjalna="N">(produkt w ofercie specjalnej)
mala_paleta="N”(czy produkt może być wysłany na małej palecie)
large="N” > (czy produkt jest towarem wielkogabarytowym)
<zdjecia> (zdjecia)
<zdjecie
plik="/Pictures/SIE/BAK/ SIEEDIBAK0006/1.jpg"(ścieżka do pliku, używana przy wywoływaniu zdjęć)
domyslne="1"(zdjęcie domyślne)
data="2006-12-01"(data dodania zdjęcia) />
   </zdjecia> (koniec listy zdjęć)
    <technika> (opis techniczny)
(parametry techniczne)
<parametr
nazwa="Prędkość maksymalna"
opis="Wi-Fi 54Mbps ( 18 dBm, RP-SMA odłączalna Antena x 1), 1xRJ45"
jm="" (jednosta miary w jakiej podawany jest parametr, gdy jm=”www” to parametr jest linkiem do strony www)
typ="varchar"  />
</technika> (zamkniecie opisu technicznego)
</produkt> (zamknięcie produktu)
</produkty> (zamknięcie listy produktów)
</katalog> (końcowy znacznik tego dokumentu xml)



501 577 551  michał



Tutaj zamieszczam kawałek XML gotowego

Kod
  <GrupyTowarowe>
    <GrupaGlowna id="GIP" nazwa="_Gadżety i Prezenty">
      <PodGrupy>
        <PodGrupa id="GIP-GAD" nazwa="Gadżety" />
        <PodGrupa id="GIP-GRY" nazwa="Gry" />
        <PodGrupa id="GIP-ZAB" nazwa="Zabawki" />
      </PodGrupy>
    </GrupaGlowna>
    <GrupaGlowna id="MAT" nazwa="_Materiały reklamowe">
      <PodGrupy>
        <PodGrupa id="MAT-REK" nazwa="Materiały reklamowe" />
      </PodGrupy>
    </GrupaGlowna>
    <GrupaGlowna id="AGA" nazwa="AGD - Akcesoria">
      <PodGrupy>
        <PodGrupa id="AGA-EKF" nazwa="Do ekspresów do kawy - filtry" />
        <PodGrupa id="AGA-EKO" nazwa="Do ekspresów do kawy - odkamieniacze" />
        <PodGrupa id="AGA-LAK" nazwa="Do lodówek - akcesoria" />
        <PodGrupa id="AGA-ODW" nazwa="Do odkurzaczy - worki" />
        <PodGrupa id="AGA-OKF" nazwa="Do okapów - filtry" />
      </PodGrupy>
    </GrupaGlowna>
    <GrupaGlowna id="AGD" nazwa="AGD - Produkty">
      <PodGrupy>
        <PodGrupa id="AGD-AKC" nazwa="Akcesoria" />
        <PodGrupa id="AGD-CHL" nazwa="Automaty do pieczenia chleba" />
        <PodGrupa id="AGD-BAT" nazwa="Baterie kuchenne" />
        <PodGrupa id="AGD-LOZ" nazwa="Chłodziarko-zamrażarki do zabudowy (lodówki)" />
        <PodGrupa id="AGD-LOW" nazwa="Chłodziarko-zamrażarki wolnostojące (lodówki)" />
        <PodGrupa id="AGD-CZE" nazwa="Czajniki elektryczne" />
        <PodGrupa id="AGD-DEP" nazwa="Depilatory" />
        <PodGrupa id="AGD-DES" nazwa="Deski do prasowania" />
        <PodGrupa id="AGD-DZF" nazwa="Dzbanki filtrujące" />
        <PodGrupa id="AGD-EXP" nazwa="Ekspresy do kawy" />
        <PodGrupa id="AGD-EXZ" nazwa="Ekspresy do kawy - do zabudowy" />
        <PodGrupa id="AGD-FRY" nazwa="Frytkownice" />
        <PodGrupa id="AGD-GAR" nazwa="Garnki / patelnie" />
        <PodGrupa id="AGD-GOL" nazwa="Golarki" />
        <PodGrupa id="AGD-GRE" nazwa="Grille elektryczne" />
        <PodGrupa id="AGD-GRO" nazwa="Grzejniki olejowe" />
        <PodGrupa id="AGD-JAJ" nazwa="Jajowary" />
        <PodGrupa id="AGD-KMB" nazwa="Kombiwary" />
        <PodGrupa id="AGD-KRA" nazwa="Krajalnice" />
        <PodGrupa id="AGD-KMZ" nazwa="Kuchenki mikrofalowe do zabudowy" />
        <PodGrupa id="AGD-KMW" nazwa="Kuchenki mikrofalowe wolnostojące" />
        <PodGrupa id="AGD-KWZ" nazwa="Kuchnie do zabudowy" />



A oto mój plik php który ma za zadanie odczyt tego shitu

Kod
<?php
$xml = simplexml_load_file('action.xml');

      foreach($xml->GrupyTowarowe as $gg){
            $idGrupy = $gg->GrupaGlowna['id'];
            $nazwaGrupy = $gg->GrupaGlowna['nazwa'];
        }

echo $idGrupy ." - ". $nazwaGrupy;
?>


Z czym mam problem a otóż z tym że tylko wyświetla pierwszą grupę (<GrupaGlowna id="GIP" nazwa="_Gadżety i Prezenty") reszty nie wczytuje i nie wyświetla, oraz chce się dostać do <PodGrupy> i tez nie mogę próbowałem robić pętle w pętli (forach) kombinowałem np z $idGrupy = $gg->GrupaGlowna->PodGrupy['id']; i takie tam i nic, przykłady brane z manuala więc nie potrzebny mi do niego link, mam się bawić z tym simpleXMl czy brać pod uwagę coś innego?
krzysiekk
może tak

  1.  
  2. <?php
  3. $xml = simplexml_load_file('action.xml');
  4.  
  5. foreach ($xml->children() as $node) {
  6.  
  7. //print_r($node);
  8. $arr = $node->attributes(); // returns an array
  9. print ("id=".$arr["id"]."<br />"); // get the value of this attribute
  10.  
  11.  
  12.  
  13.  
  14.  
  15. }
  16.  
  17.  
  18. ?>
madsix
A czy zamiast children trzeba coś wpisać lub atribute?. Może zapytam się tak czy za pomocą simlexml dokonam czegoś takiego jak przypisanie zmiennej odpowiednim wartością XML i wstawię je do MySQL? Bo jeśli nie to szkoda roboty

wykminiłem coś takiego coś takiego ale nadal wypisuje mi tylko po 1 i to pierwszym atrybucie

Kod
<?php
$xml = simplexml_load_file('action.xml');


foreach($xml->GrupyTowarowe as $gd){

$GGid = $gd->GrupaGlowna['id'];

$GGnazwa = $gd->GrupaGlowna['nazwa'];

$PGid= $gd->GrupaGlowna->PodGrupy->PodGrupa['id'];

$PGnazwa = $gd->GrupaGlowna->PodGrupy->PodGrupa['nazwa'];

}

echo $GGid ." <br />";
echo $GGnazwa ." <br />";
echo $PGid ." <br />";
echo $PGnazwa ." <br />";
?>




To znajdzie się ktoś kto mi powie jak polski normalny sposób zrobić coś takiego abym mógł tu zastosować zmienne potem to wrzucić do mojego mysql-a?
Napisze to tak prosto jak tylko mogę wiem jak wyciągnąć każdy jeden atrybut z tego pieprzonego xmla, może zamiast foreach zrobić while aby wywalało wszystko nie tylko pierwszy atrybut problem z początku mam GrupTowarowych chyba z 30 a to oddaje tylko jedna tak samo produktów mam 20000 a wypisuje tylko jeden

Kod
$xmlIterator = new SimpleXMLIterator('action',null,true);
$xmlIterator->rewind();

while ($xmlIterator->valid()) {
    $temp = $xmlIterator->current();
    print_r($temp);
    $xmlIterator->next();
}


to nic nie daje wypisuje cały plik na stronie bez możliwości dalszej pracy

stosując to

Kod
$xmlDoc = new DOMDocument();
$xmlDoc->load("action.xml");
$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item) {
    print $item->nodeName . " = " . $item->nodeValue . "<br />";
}


otrzymuje tylko nazwy drzewa głównego nie wchodzi w poddrzewa

widze sens jeszcze stosowania takiego rozwiązania ale musiałbym wpisać ok 20000 path'ow także szkoda klepać ego z klay
Kod
$dom = new DomDocument();
$dom->load("action.xml");

$xpath  = new DOMXPath($dom);
$result   = $xpath->query("/GrupaTowarowa/bla/bla/bla/product/bla/bla");
foreach ($result as $element) {
    echo "\n".$element->nodeValue."\n";
}


Może ktoś z was to już robił jeśli pisze coś nie tak że nikt tego nie rozumie to napisać a wytłumaczę jak tylko mogę bo mi się już cierpliwość kończy a efektu jak nie było tak nie ma.

Kod
<?php

$xml = simplexml_load_file("action.xml");

echo $xml->getName() . "<br>";

foreach($xml->GrupyTowarowe as $GrupyTow){
        
        $IdGrupy = $GrupyTow->GrupaGlowna['id'];
        $NazGrupy = $GrupyTow->GrupaGlowna['nazwa'];
        $Dalej = $GrupyTow->PodGrupy;

        while($Dalej as $PodG){  <<<<<<tutaj mam błąd o co tu chodzi?
          $IdPodG = $PodG->PodGrupa['id'];
          $NazPodG =  $PodG->PodGrupa['nazwa'];
          }

}

echo $IdGrupy ."<br />". $NazGrupy ."<br />". $IdPodG ."<br />". $NazPodG;
?>
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.