Autor Zpráva
Vendulka
Profil *
Ahojte,
mám XML výstup pro jednotlivé data a bohužel položka <DATA> ...urls </DATA> obsahuje různý XML tvar URL(s). Potřebovala bych script, který mě prostě vždy vypíše tu první URL a to ať je to samostatně z <URL> nebo z vícero <URLS> ... tak jen to první <URL>

Nevíte jak toto mohu udělat? Sama si vůbec nevím rady :(

<DATA>
 <URL>http://www.example.com</URL>
</DATA>

<DATA>
 <URLS>
   <URL>http://www.example.com</URL>
 </URLS>
</DATA>

<DATA>
 <URLS>
   <URL>http://www.example.com</URL>
   <URL>http://www.example2.com</URL>
   <URL>http://www.example3.com</URL>
 </URLS>
</DATA>
peta
Profil
$a = strpos($str, "<URL>");
$b = strpos($str, "</URL>", $a+5);
echo substr($str, $a+5, $b-($a+5));
?
Vendulka
Profil *
peta: Já ale hledám pomoc ve zpracování XML. Počet <DATA>...</DATA> zde je libovolný.
peta
Profil
Vendulka: Jakoze ti neni jedno, jestli pouzijes php funkci pro nacteni xml (file_get_contents + simplexml_load_string) nebo normalni php funkci pro otevreni souboru (file / fopen / file_get_contents)?
Joker
Profil
peta:
No fuj!

Vendulka:
Nějak takhle:
// v $xml mám načtené XML
$data = new SimpleXMLElement($xml);
$url = isset($data->URLS) ? (string)$data->URLS->URL[0] : (string)$data->URL[0];
// v $url je ta adresa

Ukázka:
$xml = <<<XML
<DATA>
 <URLS>
   <URL>http://www.example.com</URL>
   <URL>http://www.example2.com</URL>
   <URL>http://www.example3.com</URL>
 </URLS>
</DATA>
XML;

$data = new SimpleXMLElement($xml);
$url = isset($data->URLS) ? (string)$data->URLS->URL[0] : (string)$data->URL[0];
echo $url;

Doplnění:
• Připomínám, že XML tagy rozlišují velikost písmen, takže <url> je jiný tag než <URL>.
• Když tam žádný odpovídající tag nebude, bude výsledkem prázdný řetězec.
• Když v $xml nebude platné XML, SimpleXMLElement vyhodí výjimku, takže to new SimpleXMLElement($xml); by mělo být uvnitř try-catch.
peta
Profil
Joker: Zkus is porovnat rychlost a naroky na pamet pro 100MB soubor XML nez zacnes neci reseni bezduvodne odsuzovat.
Joker
Profil
peta:
Tak schválně, pár ukázkových XML, jaký pro ně bude výsledek kódu v [#2]?
<DATA><!-- ve značce <URL> je uložený odkaz -->
 <URL>http://www.example.com</URL>
</DATA>
<DATA><URLS>
   <URL type="link">http://www.example.com</URL>
   <URL>http://www.example2.com</URL >
   <URL>http://www.example3.com</URL>
 </URLS></DATA>
<DATA><URLS>
   <URL />
   <URL>http://www.example2.com</URL>
 </URLS></DATA>

Píše Vendulka někde něco o 100MB souborech? Nebo že se lze spolehnout, že prvky nebudou prázdné, nebudou mít atributy, atd.?

XML se zpracovává XML parserem. Řetězcové operace jsou záložní možnost pokud XML parser použít nejde, nebo pro specifické odůvodněné situace.
Napsat řetězcové operace jako první řešení bez znalosti věci je ukázka toho, jak se to nemá dělat.
doyle
Profil *
peta:
Zkus is porovnat rychlost a naroky na pamet pro 100MB soubor XML nez zacnes neci reseni bezduvodne odsuzovat.

Na parsování 100MB souborů bude asi lepší zpracování pomocí SAX nebo StAX než pomocí DOM. Regex mi neprijde jako dobra volba.


doyle:
Jen tak mimochodem - regex neni ani zalozni moznost - neumi takove struktury jako XML nebo JSON naparsovat. Je to proto, ze ty spadaj do bezkontextovych jazyku a regex(regularni vyraz) dokaze parsovat pouze regularni jazyky. Parsery XML pouzivaji regularni vyrazy, ale ty samtone nestaci, jeste je k tomu treba zasobnik nebo rekurze ;-)
peta
Profil
doyle: Nerozumim, proc sem pletes regularni vyrazy. Asi omyl.

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: