webForumDet fria alternativet

SimpleXML Strul

13 svar · 1 399 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 528 inlägg
#1

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
#2
$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
#3

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
#4

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
#5

Aha, okej.
Då känns det som om jag har koll på det här.

Tack!

MickeA.comMedlem sedan feb. 20034 528 inlägg
#6

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
#7

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
#8

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
#9

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
#10

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
#11

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
#12
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
#13

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
#14

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 />";
	}
}
Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb