MickeA.comMedlem sedan feb. 20034 528 inlägg
Tjena
Jag börjat kolla lite på SimpleXML i PHP 5.x, men redan stött på problem.
XMLFILEN:
<?xml version="1.0" encoding="utf-8"?>
<result>
<status>200</status>
<error>No errors was reported during execution</error>
<allsites>
<site>
<siteid>35</siteid>
<sitename>Betfair</sitename>
</site>
<site>
<siteid>30</siteid>
<sitename>Betsson</sitename>
</site>
<site>
<siteid>39</siteid>
<sitename>Bodog</sitename>
</site>
<site>
<siteid>18</siteid>
<sitename>InterPoker</sitename>
</site>
<site>
<siteid>6</siteid>
<sitename>PartyPoker</sitename>
</site>
</allsites>
</result>
Och PHPkoden jag använder:
$xml = simplexml_load_file("example.xml");
foreach ($xml->result->allsites as $site){
print($site->sitename . "<br />\n");
}
Men inget alls skrivs ut, bara vitt överalllt.
Det jag vill göra är att skriva ut alla "sitename" från min xmlfil.
Tack!
PeddaMedlem sedan juni 20004 880 inlägg
$xml = simplexml_load_file("example.xml");
foreach ($xml->allsites->site as $site){
print($site->sitename . "<br />\n");
}
MickeA.comMedlem sedan feb. 20034 528 inlägg
Fungerade kanon!
Men jag är inte med riktigt.
I ett exempel på PHP.net så anger man inte rootnivån när man skriver ut med SimpleXML.
Rootnivån i mitt fall är ju <result>.
Är det $xml som är detsamma som <result>, eller finns det någon annan bra anledning till att det är såhär?
Tack!
PeddaMedlem sedan juni 20004 880 inlägg
MickeA.com skrev:
Är det $xml som är detsamma som <result>, eller finns det någon annan bra anledning till att det är såhär?
Tack!
Ja, den börjar ju läsa ifrån root så vad som är root behöver du inte ange.
Men låt oss säga att du har lite attribut i root (bara för skojs skull och förklara lite).
<result title="Min xml fil" filename="example.xml">
foreach($xml->attributes() as $name => $value) {
echo $name,'="',$value,"\"\n";
}
Detta skulle skriva ut:
title="Min xml fil"
filename="example.xml"
MickeA.comMedlem sedan feb. 20034 528 inlägg
Aha, okej.
Då känns det som om jag har koll på det här.
Tack!
MickeA.comMedlem sedan feb. 20034 528 inlägg
Hej!
Nu är det lite strul igen.
När jag loggar in på en sajt, ska jag via SimpleXML kolla om samma anv. är regitrerad på en annan sajt.
Gör han / hon det, så ska användar-id't från denna sajt sparas i en SESSION.
Såhär ser en del av inloggningen ut:
if($num > 0){
$xml = simplexml_load_file(_XMLPATH_ . "get-userdata.asp?account_id=" . $res['useremail'] . "&account_passwd=" . $res['userpasswd']);
if(isset($xml) && $xml->status == 200){
$_SESSION['rbuid'] = $xml->userdata->userid;
$_SESSION['rbuname'] = $xml->userdata->usermail;
}
$_SESSION['umail'] = $res['useremail'];
$_SESSION['upasswd'] = $res['userpasswd'];
$_SESSION['loggedin'] = "true";
header("Location: " . $_SERVER['PHP_SELF']);
}else{
die("Wrong username / password... try again...");
}
Allt verkar funka såhär långt, fast senare på sidan:
if(isset($_SESSION['rbuid']) && isset($_SESSION['rbuname'])){
print("Your username on 'foo' is: " . $_SESSION['rbuname']);
}else{
print("You are not a customer at 'foo' yet...");
}
Då får jag:
Warning: Unknown: Node no longer exists in Unknown on line 0
Skriver jag ut $xml->userdata->userid vid inloggning, så skrivs det ut korrekt.
Vad kan vara fel?
Tack!
MickeA.comMedlem sedan feb. 20034 528 inlägg
Aha, nu löste jag det.
Gjorde såhär istället:
if(isset($xml) && $xml->status == 200){
$rbuid = $xml->userdata->userid;
$rbuname = $xml->userdata->usermail;
}
if(isset($rbuid) && isset($rbuname)){
$_SESSION['rbuid'] = [b]"$rbuid"[/b];
$_SESSION['rbuname'] = [b]"$rbuname"[/b];
}
Då fungerar det bra.
Beror det på att i mitt första exempel vill hämta $xml->userdata->userid när jag ska skriva ut $_SESSION['userid']; ?
Går det att på "ett snyggare" sätt lösa det här?
learnMedlem sedan jan. 20051 143 inlägg
Hej,
Ja, den börjar ju läsa ifrån root så vad som är root behöver du inte ange.
Jag har en liten följdfråga. Om jag inte vill börja läsa från root utan senare, hur gör jag?
$xml = simplexml_load_file("example.xml");
foreach ($xml->allsites->site as $site){
print($site->sitename . "<br />\n");
}
Tack på förhand!
MickeA.comMedlem sedan feb. 20034 528 inlägg
I exemplet ovan börjar du läsa "senare", nämligen från $xml->allsites
Eller vad menar du med "senare"?
learnMedlem sedan jan. 20051 143 inlägg
Se nämare föklaring av mitt problem här: http://www.webforum.nu/showthread.php?t=165839
Tack!
MickeA.comMedlem sedan feb. 20034 528 inlägg
Har åter lite problem med SimpleXML.
Såhär ser min XML fil ut:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<item id="allowed_per_album" value="15" />
</config>
Den innehåller div. inställningar för en sajt och jag måste hämta "value" för ett visst "id". Jag har gjort såhär:
function read_xml($var = ""){
if(file_exists(ROOTPATH . "inc/settings.xml")){
$xml = simplexml_load_file(ROOTPATH . "inc/settings.xml");
foreach($xml->item->attributes() as $attr => $value){
if($value == $var){
return $value;
}else{
return "<p style=\"color: #ff0000; font-style: italic;\">'$var' could not be found in the settings file.</p>\n";
}
}
unset($xml);
}else{
return "<p style=\"color: #ff0000; font-style: italic;\">The settings file does not exist. Please contact site admin.</p>\n";
}
}
Tanken är nu att jag ska kunna köra:
$myvar = read_xml("allowed_per_album");
Funktionen ska då returnera "15".
Jag får inte alls ihop det här, någon som har förslag?
Tack!
SPiNMedlem sedan mars 20005 832 inlägg
function read_xml($var = ""){
if(file_exists(ROOTPATH . "inc/settings.xml")){
$xml = simplexml_load_file(ROOTPATH . "inc/settings.xml");
foreach($xml->item as $item){
if($item["id"] == $var)
return $item["value"];
}
return "<p style=\"color: #ff0000; font-style: italic;\">'$var' could not be found in the settings file.</p>\n";
}
}
MickeA.comMedlem sedan feb. 20034 528 inlägg
Då har jag lite problem med det här igen.
Såhär ser min XML fil ut:
<?xml version="1.0"?>
<Resource>
<group>
<desc>desc 0</desc>
<items>
<item>foo00</item>
<item>foo01</item>
<item>foo02</item>
<item>foo03</item>
</items>
</group>
<group>
<desc>desc 1</desc>
<items>
<item>foo10</item>
<item>foo11</item>
<item>foo12</item>
<item>foo13</item>
</items>
</group>
</Resource>
Jag laddar in filen med:
$xml = simplexml_load_file();
Skriver jag ut $xml med hjälp av print_r() får jag:
SimpleXMLElement Object
(
[group] => Array
(
[0] => SimpleXMLElement Object
(
[desc] => desc 0
[items] => SimpleXMLElement Object
(
[item] => Array
(
[0] => foo00
[1] => foo01
[2] => foo02
[3] => foo03
)
)
)
[1] => SimpleXMLElement Object
(
[desc] => desc 1
[items] => SimpleXMLElement Object
(
[item] => Array
(
[0] => foo10
[1] => foo11
[2] => foo12
[3] => foo13
)
)
)
)
)
Jag vill nu få ut det i det här formatet:
Grupp 1
foo00
foo01
foo02
foo03
Grupp 2
foo10
foo11
foo12
foo13
Det kan finns x antal <group> med x antal <item> och jag gissade att det här skulle funka för att t.ex. kunna plocka ut Grupp 0:
print_r($xml['group'][0]);
Men då skrivs inget alls ut.
Måste man formatera det på något annat sätt när man jobbar med SimpleXML?
Tacksam för alla förslag.
MickeA.comMedlem sedan feb. 20034 528 inlägg
Nu har jag löst det och för er som skulle undra samma sak någon gång, ska man använda $xml->group[0] istället för $xml['group'][0].
Den här koden skriver ut min xml precis som jag vill:
for($i = 0; $i <= sizeof($xml->group); $i++){
echo "<h2>" . $xml->group[$i]['id'] . "</h2>";
if(isset($xml->group[$i]->items->item)){
foreach($xml->group[$i]->items->item as $key => $val){
if(strlen($val->value) > 0){
echo " " . htmlentities($val->value) . "<br />";
}
}
echo "<br />";
}
}