Ik heb volgende xml bestand:
<?xml version="1.0" encoding="UTF-8"?>
<projects>
	<project name="gps">
		<title>GPS Data Logger</title>
		<url></url>
		<forumurl></forumurl>
		<downloadurl>downloads/GDL.zip</downloadurl>
		<author>okidokie</author>
		<pdate>01-12-2009</pdate>
		<status>completed</status>
		<pages>
			<pageurl name="info">gpsdatalogger/pages/1.php</pageurl>
			<pageurl name="sources">gpsdatalogger/pages/2.php</pageurl>
			<pageurl name="setup">gpsdatalogger/pages/3.php</pageurl>
			<pageurl name="testing">gpsdatalogger/pages/4.php</pageurl>
			<pageurl name="wiring">gpsdatalogger/pages/5.php</pageurl>
			<pageurl name="finish">gpsdatalogger/pages/6.php</pageurl>
		</pages>
	</project>
	<project name="rfid">
		<title>RFID Card Reader Software</title>
		<url></url>
		<forumurl></forumurl>
		<downloadurl>downloads/RFID.zip</downloadurl>
		<author>Chris</author>
		<pdate>30-11-2009</pdate>
		<status>completed</status>
		<pages>
			<pageurl name="info">rfid/pages/page1.php</pageurl>
			<pageurl name="testing">rfid/pages/page2.php</pageurl>
		</pages>
	</project>
</projects>


Nu wil ik via een functie dmv een naam, die ik als parameter meegeef, tot de betreffende node geraken.

vb aanroep functie : getProject("rfid")
deze moet dan de pagina's halen (pageurl's) uit dat xml bestand. Hier in dit geval uit het 2e project met als naam "rfid"

ik kan wel via $xml= $xml->project[1] (dmv integer) wel tot het resultaat komen, maar had dit liever gedaan via de 'name' attribuut van het project.

Hoe kan ik dit bereiken?

grtz
Dat zou je op de volgende manier met xpath kunnen doen:


<?php

function getProject($var) {
    $xml = simplexml_load_file('filename.xml');
    $xml->xpath('//project[@name="'.$var.'"');
    return $var[0];
    //geeft simplexml element terug, namelijk degene met name=$var
}

?>


Natuurlijk wel even controleren of je file bestaat en of je inderdaad resultaat hebt, maar dat kan je zelf inbouwen.

zie ook php.net
Leen, deze gaf een error waar ik eigenlijk niets wijzer uit werd.
Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: Invalid predicate in C:\wamp\www\savagecircuits\xpath.php on line 4

Warning: SimpleXMLElement::xpath() [simplexmlelement.xpath]: xmlXPathEval: evaluation failed in C:\wamp\www\savagecircuits\xpath.php on line 4

Maar heb het kunnen oplossen door deze
$xml = simplexml_load_file("xml/projects.xml"); 
$res = simplexml_load_string($xml->asXML()); 
$row = $res->xpath('//project[@name="gps"]'); 
echo'<pre>';
print_r( $row[0]->pages);
echo'</pre>';


en het resultaat:

SimpleXMLElement Object
(
[pageurl] => Array
(
[0] => gpsdatalogger/pages/1.php
[1] => gpsdatalogger/pages/2.php
[2] => gpsdatalogger/pages/3.php
[3] => gpsdatalogger/pages/4.php
[4] => gpsdatalogger/pages/5.php
[5] => gpsdatalogger/pages/6.php
)

)
=> alle url's voor het project met als naam 'gps' :)
Bedankt om me op weg te helpen, grtz


Mooi dat het werkt.

De reden dat je een error kreeg was omdat er een typefout in mijn voorbeeldje stond: (excuses daarvoor)

'//project[@name="'.$var.'"' 
moest zijn:
'//project[@name="'.$var.'"]'


Jouw code kan korter:

$xml = simplexml_load_file("xml/projects.xml"); 
$row = $xml->xpath('//project[@name="gps"]'); 
echo'<pre>';
print_r( $row[0]->pages);
echo'</pre>';

Dat is bovendien volgens de regelen der kunst, die asXML() is nergens voor nodig.

Reageren