Aan een landelijke instantie wil ik gegevens mbv xml overleggen. Deze instantie heeft me een structuur aangeleverd waar ik verder geen invloed op heb.
Ik was tot voorkort niet bekend met xml maar kom er een heel eind uit.


De structuur en de php-code zoals hier levert het gewenste resultaat op.

<?php 
$xml = '<example xmlns:mel="link" xmlns:naam="verwijzing" xmlns:kind="my.foo.urn">
 
	<kennis>
		<naam:a>Margje</naam:a>
		<naam:b>Daisyree</naam:b>
		<naam:c>Elke</naam:c>
	</kennis>
	<kennis>
		<naam:a>Bas</naam:a>
		<naam:b>Ruben</naam:b>
		<naam:c>Wessel</naam:c>
	</kennis>
</example>';

$sxe = new SimpleXMLElement($xml);



$i=0;
foreach($sxe->kennis as $kennis) {

$kids = $sxe->kennis[$i]->children('naam', TRUE);	
	$a =  $kids->a ;
	$b = $kids->b;
	$c = $kids->c;
	echo "naam a = $a <br>";
	echo "naam b = $b <br>";
	echo "naam c = $c <br>";
	
	echo "<br><br>";

$i++;	
	
}
echo "<br>";
?>

De stuctuur ziet er echter zo uit :
<example xmlns:mel="link" xmlns:naam="verwijzing" >
   <mel:meldtGeboorte>
	<kennis>
		<naam:a>Margje</naam:a>
		<naam:b>Daisyree</naam:b>
		<naam:c>Elke</naam:c>
	</kennis>
	<kennis>
		<naam:a>Bas</naam:a>
		<naam:b>Ruben</naam:b>
		<naam:c>Wessel</naam:c>
	</kennis>
   </mel:meldtGeboorte>
</example>

Hoe moet ik de tag <mel:meldtGeboorte> beschrijven/toevoegen in mijn code om bovenstaand resultaat te bereiken. Ik krijg het niet voor elkaar.
Kan iemand mij hierbij helpen. Alvast bedankt.
xmlns = XML NameSpace

Daarin definieer je namespaces alias welke in de descendants gebruikt kunnen worden. In dit geval de alias mel welke de namespace link is en de alias naam welke verwijst naar de namespace verwijzing.

Om deze elementen op te halen vragen we eerst alle elementen van dat namespace op die descendants zijn van het huidige element en vervolgens kunnen we het juiste child selecteren:
<?php
$xml = <<<EOX
<example xmlns="..." xmlns:book="http://example.org/schema/dic/book">
<book>
<book:title>Foobar</book:title>
<book:author>Wouter J</book:author>
<!-- ... -->
</book>
</example>
EOX
;

$sxml = new SimpleXmlElement($xml);

foreach ($sxml->book as $book) {
$bookMetadata = $book->chidren('http://example.org/schema/dic/book');

echo $bookMetadata->author.' heeft het boek "'.$bookMetadata->title.'" geschreven';
}
?>
Bedankt Wouter,

Jouw reactie heeft me aan het denken gezet en heb mijn code aangepast. Ik heb er zeker wat aan gehad, echter is mijn vraag niet beantwoord. Na de eerste tag (met namespace declaraties) komt in werkelijkheid een tag met een namespace. Zie de xml-structuur in het laatste stuk van mijn topic hierboven. Voor mijn foreach loop moet m.i. nog iets worden gecodeerd. Maar wat ?

mijn code is inmiddels :

<?php 
$xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
						  xmlns:mel="http://www.ienr.org/schemas/services/meldingenWS_v2_0" 
						  xmlns:mel1="http://www.ienr.org/schemas/types/meldingen_v2_0">
 <mel:vastleggenGeboorteMelding>
    <request>
        <mel1:a>Margje</mel1:a>
        <mel1:b>Daisyree</mel1:b>
        <mel1:c>Elke</mel1:c>
    </request>
    <request>
        <mel1:a>Bas</mel1:a>
        <mel1:b>Ruben</mel1:b>
        <mel1:c>Wessel</mel1:c>
    </request>
 </mel:vastleggenGeboorteMelding>
</soapenv:Envelope>';

$sxe = new SimpleXMLElement($xml);

/*$mel = $......
OF
foreach($sxe->........)
*/
	foreach($sxe->request as $mel1) {
		$mel1data = $mel1->children('http://www.ienr.org/schemas/types/meldingen_v2_0');
	
		echo $mel1data->a.'<br>';
		echo $mel1data->b.'<br>';
		echo $mel1data->c.'<br>';
		echo '<br>';
}
echo "<br>";
?>
$sxe bevat nu het root element (soapenv:Envelope). Je moet eerst in de "mel namespace" komen:
<?php
$mels = $sxe->children("http://www.ienr.org/schemas/services/meldingenWS_v2";);
?>
En dan vraag je het vastleggenGeboorteMelding element op:
<?php
$mels->vastleggenGeboorteMelding;
?>
En als het element is opgevraagd hoe roep ik dan de tag request aan ?

Met comando var_dump(count($rij)); wordt bevestigd dat namespace mel 1 x bestaat.
Ik zit nu dus in het element vastleggenGeboorteMelding. Maar nu ?
Ik probeer van alles maar de zes namen krijg ik niet in beeld. Via google kan ik ook niets gevonden krijgen wat me kan helpen.

Overigens, m.i. is element request een child van vastleggenGeboorteMelding.
Weet iemand hoe ik binnen <mel:vastleggenGeboorteMelding> <request> kan aanroepen ?

<?php 
$xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
						  xmlns:mel="http://www.ienr.org/schemas/services/meldingenWS_v2_0" 
						  xmlns:mel1="http://www.ienr.org/schemas/types/meldingen_v2_0">
 <mel:vastleggenGeboorteMelding>
    <request>
        <mel1:a>Margje</mel1:a>
        <mel1:b>Daisyree</mel1:b>
        <mel1:c>Elke</mel1:c>
    </request>
    <request>
        <mel1:a>Bas</mel1:a>
        <mel1:b>Ruben</mel1:b>
        <mel1:c>Wessel</mel1:c>
    </request>
 </mel:vastleggenGeboorteMelding>
</soapenv:Envelope>';

$sxe = new SimpleXMLElement($xml);

$mels = $sxe->children("http://www.ienr.org/schemas/services/meldingenWS_v2_0"); 
$rij = $mels->vastleggenGeboorteMelding;
var_dump(count($rij));  
#GEEFT 0 ELEMENTEN $rt = $rij->children;	var_dump(count($rt));
#FOUT $rt = $rij->request->children("http://www.ienr.org/schemas/types/meldingen_v2_0");

	foreach($rij->request as $mel1) {
		$mel1data = $mel1->children('http://www.ienr.org/schemas/types/meldingen_v2_0');
	
		echo $mel1data->a.'<br>';
		echo $mel1data->b.'<br>';
		echo $mel1data->c.'<br>';
		echo '<br>';
}
echo "<br>";
?>
Heeft er niemand een idee hoe ik binnen het element mel:vastleggenGeboorteMelding het element request kan aanroepen. Ik krijg (hoogstens) geen foutmeldingen maar ook geen (verwachte) persoonsnamen te zien. Ik krijg het niet voor elkaar. Kan iemand mij verder helpen ?

Reageren