Bonjours
Le titre est assez descriptif, je crois.
J'ai un gros fichier xml (200 Mo) duquel je veux extraire seulement certains noeuds. Tout ça en PHP.
Mon fichier xml est comme celui-ci (je l'ai réduit pour l'exemple)
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 <?xml version='1.0' encoding='UTF-8'?> <osm version="0.6" generator="Osmosis 0.39"> <node id="21405637" version="5" timestamp="2011-11-08T09:36:26Z" uid="422863" user="Virgílio" changeset="9771590" lat="32.8232559" lon="-17.1026471"> <tag k="source" v="PGS"/> <tag k="sport" v="swimming"/> </node> <node id="21410164" version="8" timestamp="2012-01-07T21:35:36Z" uid="61942" user="SomeoneElse" changeset="10326005" lat="32.7348317" lon="-17.2082492"> <tag k="leisure" v="slipway"/> <tag k="source" v="PGS"/> </node> <node id="24984214" version="3" timestamp="2008-04-16T20:04:24Z" uid="8204" user="oha" changeset="162913" lat="38.6099096" lon="-9.1015325"> <tag k="name" v="Fogueteiro"/> <tag k="railway" v="station"/> </node> <node id="25414227" version="4" timestamp="2009-02-28T21:08:53Z" uid="39787" user="jakomo" changeset="701481" lat="38.7457767" lon="-9.1354754"> <tag k="name" v="Roma - Areeiro"/> <tag k="railway" v="station"/> </node> <node id="1638129315" version="1" timestamp="2012-02-18T20:05:56Z" uid="32168" user="Fernandinand" changeset="10723860" lat="40.1147978" lon="-8.5139013"> <tag k="emergency" v="fire_hydrant"/> <tag k="fire_hydrant:position" v="sidewalk"/> <tag k="fire_hydrant:type" v="pillar"/> </node> </osm>
Je lis mon fichier avec xmlreader et j'utilise épand pour copier le noeud et le traiter comme un objet DOM.
J'essais de filtrer le noeud avec le contenu d'un enfant. C'est là que je coince
J'obtiens ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 <?php $country = "portugal.xml"; $cat = "railway"; $filename= "SuperTest.xml"; header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=$filename"); header("Content-Type: application/force-download; charset=utf-8"); if(file_exists($country)) { $xml = new XMLReader(); $xml->open($country); // input file as source while($xml->read()){ if($xml->nodeType == XMLReader::ELEMENT) { if($xml->hasAttributes){ // vérifie que le noeud à des enfants if($xml->getattribute("k") == $cat) { // je compare les enfants pour coincidence avec ma variable $cat (railway) $node = $xml->expand(); $dom = new DomDocument(); $n = $dom->importNode($node,true); $dom->appendChild($n); $sxe = simplexml_import_dom($n); echo $sxe->asXML(); } } } } } ?>
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?xml version="1.0"?> <tag k="railway" v="station"/> <?xml version="1.0"?> <tag k="railway" v="station"/>
Je souhaite retrouver les noeuds dans lesquel "station" se trouvent, complets parents et enfants:
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <?xml version="1.0"?> <osm> <node id="24984214" version="3" timestamp="2008-04-16T20:04:24Z" uid="8204" user="oha" changeset="162913" lat="38.6099096" lon="-9.1015325"> <tag k="name" v="Fogueteiro"/> <tag k="railway" v="station"/> </node> <node id="25414227" version="4" timestamp="2009-02-28T21:08:53Z" uid="39787" user="jakomo" changeset="701481" lat="38.7457767" lon="-9.1354754"> <tag k="name" v="Roma - Areeiro"/> <tag k="railway" v="station"/> </node> </osm>
Si je supprime les deux conditions
la requête PHP me retourne bien un clone du premier xml (bien entendu sans conditions, donc complet).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if($xml->hasAttributes){ if($xml->getattribute("k") == $cat) {
Je ne sais pas si l'orientation que j'ai suivit me permettra d'aboutir à un résultat correct…
Merci de m'aiguiller, car là je sèche
Remiguel
Partager