Autor Zpráva
LuMaX
Profil
Ahoj všem, vím že to bude nějaká blbost, ale musím se zeptat, protože už nevím jak dál.

Mám XML soubor, kde je mraky hodnot, ale nachází se zde i duplicitní hodnoty, které mohou být různě proházené (viz příklad níže). A o co mi jde...
Potřebuju z toho dokumentu vytáhnout data, ale v případě že jedu dle podmínek, tak mi to vypíše vždy prví skupinu, ale další skupiny ne.

A teď příklad:
berme v potaz zhruba takový formát

<?xml version="1.0" encoding="utf-8" ?>
<note>
    <to>
        <form>A</form>
        <heading>B</heading>
        <body>C</body>
    </to>
    <to>
        <form>D</form>
        <heading>E</heading>
        <body>F</body>
    </to>
</note>

ale může být i takto:
<?xml version="1.0" encoding="utf-8" ?>
<note>
      <to>
       <form>D</form>
       <heading>E</heading>
       <body>F</body>
    </to>
    <to>
        <form>A</form>
        <heading>B</heading>
        <body>C</body>
    </to>
</note>

A co tedy potřebuji.
Potřebuji nějakou funkci, pomocí které si vytáhnu data nějak takto:
$xml->note->to->form (popřípadě heading / body) a to pro skupinu, kterou si zvolím podle nějaké podmínky dle <form>?</form>

Takže bych potom mohl mít zhruba tabulku takto:
parametr: to
form: D <- tohle by mělo rozhodovat o tom, jaké data budou v heading a body, popřípadě další v této skupině... tedy za <form>D</form>
heading: E
body: F

Nevím jestli to lze udělat a zda jsem to popsal správně, ale ať hledám jak hledám, ať zkouším co zkouším, tak nemůžu najít nic, co by to vyřešilo. Vždy se kousnu na tom, že mi to přečte první skupinu <to> a už je jedno, zda je tam další skupina <to>. Hlavně mi ale taky jde o to, aby se bral v podmínce ohled na to, co obsahuje <to> ve <form> a potom pokračoval ve čtení toho uzlu <to>, ve kterém je podmínkou daný obsah <form>.

PS: dodám jen to, že už mám hotovou stránku, která třídí XML dokument, který obsahuje i výše zmíněné kusy kódu. Otázka je, zda to vůbec půjde vytvořit a nebude lepší to přepsat. Koukal jsem i na XPATH, ale než se do toho pustím, tak jsem chtěl vědět, zda to lze vyřešit i jinak bez přepisování v SimpleXML.

Jinak co jsem zatím našel, tak že se SimpleXML k tomu chová jako že je to pole, ale nevím jak vybrat jen ten index z pole, který opravdu potřebuju (podle hodnoty <form></form>).
nightfish
Profil
Máš na mysli něco v tomhle duchu?
LuMaX
Profil
@nightfish: To bude přesně ono. Čumím tady na to jak husa do flašky a přitom je to tak easy... Díky za nakopnutí správným směrem. Dám ještě vědět, zda to vyřešilo tak jak jsem chtěl.


EDIT:
tak mám ještě dotaz k jedné záležitosti...

Jak mám udělat to, že když v uvedeném příkladu níže není daný kus kódu v XML vstupu, tak se podmínka vyhodnotí jako záporná a vypíše mi echo? Když jsem v podmínkách šel IF->ELSEIF->ELSE, tak mi to hodí chybu.

Hodil jsem to i sem na testy: 3v4l.org

<?php
$data = '<?xml version="1.0" encoding="utf-8" ?>
<note>
  <to>
    <form>heslo0</form>
    <heading>A</heading>
    <body>C</body>
  </to>
  <to>
    <form>heslo1</form>
    <heading>A</heading>
    <body>F</body>
  </to>
</note>';

$xml = simplexml_load_string($data);
  foreach ($xml->to as $to){
      if     ($to->form == 'heslo0' && $to->heading == 'A'){echo "povoleno";}
      elseif ($to->form == 'heslo0' && $to->heading == 'B'){echo "nepovoleno";}
      elseif ($to->form == 'heslo0' && $to->heading == 'C'){echo "blokováno";}
  } // po sem se splní a vypíše "povoleno"
  echo "<br>";
  foreach ($xml->to as $to){
      if     ($to->form == 'heslo2' && $to->heading == 'A'){echo "povoleno";}
      elseif ($to->form == 'heslo2' && $to->heading == 'B'){echo "nepovoleno";}
      elseif ($to->form == 'heslo2' && $to->heading == 'C'){echo "blokováno";}
  } // tady už neexistuje daný blok, tak bych chtěl vypsat hlášku třeba "neaktivní"
?>

Lze to nějak spáchat?
LuMaX
Profil
Kdyby někdo potřeboval řešení tak jako já, tak tady je :) Je to trochu modifikovaná verze toho, co jsem dával výše, proto přidávám i s tím XML v $data.

<?php 
$data = '<?xml version="1.0" encoding="utf-8" ?>
<note>
  <to>
    <form>pswA</form>
    <heading>A</heading>
  </to>
  <to>
    <form>pswB</form>
    <heading>A</heading>
  </to>
</note>';

$xml = simplexml_load_string($data);
$pswA_found = false;
    foreach ($xml->to as $to){
        if     ($to->form == 'pswA' && $to->heading == 'A'){echo "allow"; $pswA_found = true;}
        elseif ($to->form == 'pswA' && $to->heading == 'B'){echo "notallow"; $pswA_found = true;}
        elseif ($to->form == 'pswA' && $to->heading == 'C'){echo "block";$pswA_found = true;}
}
if (!$pswA_found) {echo "No active service for pswA";}

$pswC_found = false;
    foreach ($xml->to as $to){
        if     ($to->form == 'pswC' && $to->heading == 'A'){echo "allow"; $pswC_found = true;}
        elseif ($to->form == 'pswC' && $to->heading == 'B'){echo "notallow"; $pswC_found = true;}
        elseif ($to->form == 'pswC' && $to->heading == 'C'){echo "block"; $pswC_found = true;}
        }
    if (!$pswC_found) {echo "No active service for pswC";}
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: