Je dois obtenir un fichier XML dans une base de données. Ce n'est pas le problème. Je ne peux pas le lire, l'analyser et créer des objets à mapper à la base de données. Le problème est que parfois le fichier XML peut contenir des espaces de noms et parfois non. De plus, parfois, il n'y a aucun espace de nommage défini.PHP analyse fichier XML avec et sans espaces de noms
Alors ce que je suis arrivé était quelque chose comme ceci:
<?xml version="1.0" encoding="UTF-8"?>
<struct xmlns:b="http://www.w3schools.com/test/">
<objects>
<object>
<node_1>value1</node_1>
<node_2>value2</node_2>
<node_3 iso_land="AFG"/>
<coords lat="12.00" long="13.00"/>
</object>
</objects>
</struct>
Et l'analyse syntaxique:
$obj = new stdClass();
$nodes = array('node_1', 'node_2');
$t = $xml->xpath('/objects/object');
foreach($nodes AS $node) {
if($t[0]->$node) {
$obj->$node = (string) $t[0]->$node;
}
}
Cest bien tant qu'il n'y a pas namespaces. Voici le fichier XML avec espaces de noms:
<?xml version="1.0" encoding="UTF-8"?>
<b:struct xmlns:b="http://www.w3schools.com/test/">
<b:objects>
<b:object>
<b:node_1>value1</b:node_1>
<b:node_2>value2</b:node_2>
<b:node_3 iso_land="AFG"/>
<b:coords lat="12.00" long="13.00"/>
</b:object>
</b:objects>
</b:struct>
je maintenant est venu avec quelque chose comme ceci:
$xml = simplexml_load_file("test.xml");
$namespaces = $xml->getNamespaces(TRUE);
$ns = count($namespaces) ? 'a:' : '';
$xml->registerXPathNamespace("a", "http://www.w3schools.com/test/");
$nodes = array('node_1', 'node_2');
$obj = new stdClass();
foreach($nodes AS $node) {
$t = $xml->xpath('/'.$ns.'objects/'.$ns.'object/'.$ns.$node);
if($t[0]) {
$obj->$node = (string) $t[0];
}
}
$t = $xml->xpath('/'.$ns.'objects/'.$ns.'object/'.$ns.'node_3');
if($t[0]) {
$obj->iso_land = (string) $t[0]->attributes()->iso_land;
}
$t = $xml->xpath('/'.$ns.'objects/'.$ns.'object/'.$ns.'coords');
if($t[0]) {
$obj->lat = (string) $t[0]->attributes()->lat;
$obj->long = (string) $t[0]->attributes()->long;
}
qui fonctionne avec les espaces de noms et sans. Mais je pense qu'il doit y avoir un meilleur moyen. Avant cela, je pouvais faire quelque chose comme ça:
$t = $xml->xpath('/'.$ns.'objects/'.$ns.'object');
foreach($nodes AS $node) {
if($t[0]->$node) {
$obj->$node = (string) $t[0]->$node;
}
}
Mais cela ne fonctionnera pas avec les espaces de noms.
cela ne fonctionnera pas: $ t = $ xml-> xpath ('/ * [nom-local() = "objets"]/* [nom-local() = "objet"]'); cela fonctionne: $ t = $ xml-> xpath ('/ * [nom-local() = "objets"]/* [nom-local() = "objet"]/*'); mais je ne peux pas accéder aux clés ... – Mike