Avatar billede fixbabe Nybegynder
11. februar 2011 - 22:05 Der er 6 kommentarer og
1 løsning

qstat - xml

Jeg får følgende array med xml ud fra qstat, jeg vil gerne have resultatet "pløjet" igennem så jeg kan hente værdien "protocol,gamedir & gamedir" ud.

Array
(
    [0] => <?xml version="1.0" encoding="iso-8859-1"?>
    [1] => <qstat>
    [2] =>      <server type="A2S" address="192.168.1.1:27015" status="UP">
    [3] =>              <hostname>192.168.1.1:27015</hostname>
    [4] =>              <name>servernavn</name>
    [5] =>              <gametype>cstrike</gametype>
    [6] =>              <map>de_airstrip</map>
    [7] =>              <numplayers>0</numplayers>
    [8] =>              <maxplayers>12</maxplayers>
    [9] =>              <ping>1</ping>
    [10] =>            <retries>2</retries>
    [11] =>            <rules>
    [12] =>                    <rule name="protocol">30</rule>
    [13] =>                    <rule name="gamedir">cstrike</rule>
    [14] =>                    <rule name="gamename">Counter-Strike</rule>
    [15] =>                    <rule name="dedicated">1</rule>
    [16] =>                    <rule name="sv_os">linux</rule>
    [17] =>                    <rule name="password">1</rule>
    [18] =>                    <rule name="version">1.1.2.6/Stdio</rule>
    [19] =>            </rules>
    [20] =>    </server>
    [21] => </qstat>
)


Jeg har dette som en ven har lavet til mig men jeg har absolut ingen ide om hvordan jeg får "rules" delen hevet med ud også

$xml = simplexml_load_string(implode($output));

foreach ($xml->server[0]->attributes() AS $var => $val) {
    $$var = $val;
}

$result = $xml->xpath("server");
foreach ($result[0] AS $var => $val) {
    $$var = $val;
}
Avatar billede tjens Nybegynder
11. februar 2011 - 23:24 #1
Jeg går ud fra, at du vil have dannet en ny variabel for hver name attribut:
$rules = $xml->server[0]->rules[0];
foreach ($rules->rule AS $rule ) {
  foreach ($rule->attributes() AS $var => $val) {
    $$val=$rule;
  }
}
Avatar billede fixbabe Nybegynder
11. februar 2011 - 23:56 #2
Ja både og, jeg vil gerne have rule samt værdien for den

i stedet for dette:
name -> protocol
name -> gamedir
name -> gamename

vil jeg have dette
protocol-> 30
gamedir -> cstrike
gamename -> Counter-Strike
Avatar billede tjens Nybegynder
12. februar 2011 - 09:15 #3
#2 Det er det sidste eksempel, koden i #1 laver:

Ny variabelnavn = attributtens værdi og
variabel indhold = rule's tekstindhold.

Den tester dog ikke for om attributtens navn er "name", men så længe der kun er en attribut på en rule, vil det virke.

Den kan udvides til at teste om attributten hedder "name":

$rules = $xml->server[0]->rules[0];
foreach ($rules->rule AS $rule ) {
  foreach ($rule->attributes() AS $var => $val) {
      if ( $var == 'name' ) {
        $$val=$rule;
      }
  }
}
så der ikke bliver dannet uventede nye variable, hvis en rule skulle have attributter du ikke har med i eksemplet i #0
Avatar billede fixbabe Nybegynder
12. februar 2011 - 10:45 #4
Det virker perfekt, vil i begge smide et svar så i kan dele?
Avatar billede tjens Nybegynder
12. februar 2011 - 10:54 #5
#4 Der er kun 1 deltager i din tråd ;-)
Avatar billede fixbabe Nybegynder
12. februar 2011 - 11:07 #6
Ha ha sort.. det er sku nok for tidligt for mig endnu :D
Avatar billede tjens Nybegynder
12. februar 2011 - 16:53 #7
Jeg vil forslå en udvidelse af de 3 loops, der danner variable.
Ellers kan der opstå "uforklarlige" fejl i koden i fremtiden:

Hvis der kommer en XML-fil ind som mangler nogle felter, kan din kode få Undefined fejl.

Og endnu værre: Hvis der kommer nye linier i XML'en, med navne som dit program allerede bruger til noget andet, kan du få fejl, som er meget svære at finde.

Derfor skal du selv definere alle de forventede variable før du trækker ud af XML:
...
$hostname = "NOT FOUND";
...

og teste på at variablen allerede findes, inden der trækkes værdier ud:

foreach ($xml->server[0]->attributes() AS $var => $val) {
  if ( isset( $$var )) {
      $$var = $val;
  }
}
( og husk at det er $$var i de 2 første og $$val i den sidste! )

Derved får du kun dannet forventede nye variable, og der står noget meningsfuldt i dem, hvis en XML-fil er mangelfuld.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester