2009-07-28 11 views
13

Je veux modifier mon fichier XML en PHP en fonction des critères suivants.Comment modifier le fichier XML en utilisant PHP

ma structure xml ressemble à ceci:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

<markers> 
    <marker> 
     <type></type> 
     <title></title> 
     <address></address> 
     <latitude></latitude> 
     <longitude></longitude> 
    <marker> 
    <marker> 
     <type></type> 
     <title></title> 
     <address></address> 
     <latitude></latitude> 
     <longitude></longitude> 
    <marker> 
</markers> 

Maintenant, chaque fois que XML va modifier, avec l'attribut type. Signifie, lors de la première recherche dans la chaîne == "hotels", les données relatives aux hôtels seront stockées dans un fichier xml comme ci-dessus.

Maintenant, quand une fois de plus la recherche d'hôtels est faite, elle supprimera les éléments qui ont un élément enfant avec des hôtels de valeur.

et de rechercher une requête différente par ex. les écoles sont effectuées à ce moment-là les données relatives aux écoles sont ajoutées au fichier xml. avec les données des hôtels.

maintenant à nouveau la recherche d'écoles est fait alors il va supprimer l'élément lié aux écoles.

Merci d'avance.

+0

Les données sont « originales, complètes » source a également basé sur XML? Ou est-ce "seulement" une base de données SQL et vous voulez formater le résultat en XML? – VolkerK

+1

Avez-vous besoin de faire quelque chose que [SimpleXML] [1] ne peut pas faire? [1]: http://php.net/manual/fr/book.simplexml.php – markus

+0

Je crée un fichier XML pour google map – Avinash

Répondre

23

Vous pouvez utiliser le DOMDocument de PHP.

Vous chargez votre fichier et que la boucle par childNodes du document.

<?php 
$dom=new DOMDocument(); 
$dom->load("file.xml"); 

$root=$dom->documentElement; // This can differ (I am not sure, it can be only documentElement or documentElement->firstChild or only firstChild) 

$nodesToDelete=array(); 

$markers=$root->getElementsByTagName('marker'); 

// Loop trough childNodes 
foreach ($markers as $marker) { 
    $type=$marker->getElementsByTagName('type')->item(0)->textContent; 
    $title=$marker->getElementsByTagName('title')->item(0)->textContent; 
    $address=$marker->getElementsByTagName('address')->item(0)->textContent; 
    $latitude=$marker->getElementsByTagName('latitude')->item(0)->textContent; 
    $longitude=$marker->getElementsByTagName('longitude')->item(0)->textContent; 

    // Your filters here 

    // To remove the marker you just add it to a list of nodes to delete 
    $nodesToDelete[]=$marker; 
} 

// You delete the nodes 
foreach ($nodesToDelete as $node) $node->parentNode->removeChild($node); 

echo $dom->saveXML(); 
?> 

Vous pouvez enregistrer votre sortie XML comme celui-ci

$dom->saveXML(); // This will return the XML as a string 
$dom->save('file.xml'); // This saves the XML to a file 

Pour ce faire, l'analyse syntaxique JavaScript dans vous devez utiliser jQuery (une petite bibliothèque, mais puissant).

Vous pouvez inclure la bibliothèque directement à partir de Google Code Repository.

<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script> 

La bibliothèque est multi-navigateur et très petite. Il devrait être mis en mémoire cache dans de nombreux cas, parce que certains sites utilisent de Google Code

$(yourXMLStringOrDocument).find("marker").each(function() { 
    var marker=$(this); 

    var type=marker.find('type').text(); 
    var title=marker.find('title').text(); 
    var address=marker.find('address').text(); 
    var latitude=marker.find('latitude').text(); 
    var longitude=marker.find('longitude').text(); 
}); 
+0

oui semble bien, laissez-moi chk dans mon code – Avinash

+0

comment puis-je supprimer tous les nœuds de marqueur de mon fichier xml? – Avinash

+0

Vous ajoutez tous les marqueurs $ depuis le tableau foreach au tableau $ nodesToDelete. –

4

Document Object Model (DOM) est la réponse.

<? 
$dom=new DomDocument(); 
$dom->Load("file.xml"); 
$root=$dom->documentElement; 
... 
$dom->Save("file.xml"); 
?> 
+0

mais comment puis-je faire une boucle dans les fichiers xml? – Avinash

+3

En lisant la documentation: http://de.php.net/manual/fr/class.domelement.php – Bombe

+21

Le but de StackOverflow, à mon avis, est d'aider les utilisateurs en leur donnant des exemples qui peuvent les aider à résoudre leur problème. Ne pas impliquer qu'ils n'ont pas lu ou recherché dans la documentation. –

Questions connexes