Autor Zpráva
Pavlínka
Profil
dělám si vlastní statistiky vytížení serveru (nechce se mi používat munina a další jen kůli sledování netu....)
nainstalovala jsem si tada na server vnstat...
umí krásně generovat XML z kterého si vytahuji data...

nyní jsem ale měnila server a setkala jsem se tam s "id="
a nevede se mi z něj dostat data...

xml vypadá nějak takto:
<interface id="eth1">
<traffic>
<total>
<rx>0</rx>
.....
<interface id="eth0">
<traffic>
<total>
<rx>333</rx>
.....


na mém starém serveru byla hodnota rx jako první... tak jsem to nikdy neřešila :D
nyní ale při mé smůle potřebuji vytahnout hodnotu eth0

jak tedy upřesnit "výtah" podle ID?

...
foreach ($xml->interface->traffic->total as $item){
$totaltrafic = $item->rx;
...
Alphard
Profil
Předpokládám, že se dokument zpracovává pomocí SimpleXMLElement. Interní reprezentace xml neobsahuje přímé reference na atributy, takže je třeba projít danou skupinu tagů a najít ten správný.
1. Jsou v podstatě dvě možnosti, první je iterovat přes <interface>, pomocí SimpleXMLElement::attributes zjišťovat atributy a ten správný zpracovat.
2. Protože podobná věc je potřeba častěji, byl vytvořen jazyk XPath, který umožňuje adresovat část XML stromu. Najít libovolně zanořený tag interface s id rovným eth0 by mělo jít pomocí dotazu //interface[@id="eth0"]. Daný dotaz lze vyhledat pomocí SimpleXMLElement::xpath.
Pavlínka
Profil
na to jsem koukala ale úplně moudrá jsem z toho nebyla... v "ukázkách" je vždy pouze jedna "proměnná" zde mám ale strom 4... interface->traffic->total->rx
Alphard
Profil
$source = '<xml>
    <interface id="eth1">
        <traffic>
            <total>
                <rx>0</rx>
            </total>
        </traffic>
    </interface>

    <interface id="eth0">
        <traffic>
            <total>
                <rx>333</rx>
            </total>
        </traffic>
    </interface>
</xml>';

$tree = simplexml_load_string($source);
$interface = $tree->xpath('//interface[@id="eth0"]')[0];

echo (string) $interface->traffic->total->rx; // 333

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: