2009-07-28 15 views
13

Quiero modificar mi archivo xml en PHP según los siguientes criterios.Cómo modificar el archivo xml usando PHP

mi estructura XML aspecto:

<?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> 

Ahora cada vez que xml va a modificar, con el atributo type.

significa, en la cadena de búsqueda por primera vez == "hoteles", los datos relacionados con los hoteles se almacenarán en un archivo xml como el anterior.

Ahora, cuando vuelva a realizar la búsqueda de hoteles, se eliminarán los elementos que tengan elemento hijo con hoteles de valor.

y busque otra consulta para, p. Ej. las escuelas se realizan en ese momento los datos relacionados con las escuelas se anexan al archivo xml. con los datos de los hoteles.

ahora otra vez búsqueda de escuelas se hace, a continuación, se eliminará el elemento relacionado con las escuelas.

Gracias de antemano.

+0

es la fuente "" originales completos de datos XML basado también? ¿O es "solo" una base de datos SQL y desea formatear el resultado como xml? – VolkerK

+1

¿Necesita hacer algo [SimpleXML] [1] que no puede hacer? [1]: http://php.net/manual/en/book.simplexml.php – markus

+0

Estoy creando xml para google map – Avinash

Respuesta

23

Puede utilizar el DOMDocument de PHP.

Carga su archivo y luego bucle a través del childNodes del documento.

<?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(); 
?> 

Puede guardar su salida XML como esto

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

Para ello el análisis sintáctico en JavaScript se debe utilizar jQuery (una biblioteca pequeña, pero poderosa).

Puede incluir la biblioteca directamente desde el Repositorio de Código de Google.

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

La biblioteca es multi-navegador y muy pequeña. Se debe almacenar en caché en muchos casos, debido a que algunos sitios utilizan desde 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

sí parece bueno, déjame chk en mi código – Avinash

+0

¿cómo elimino todos los nodos marcadores de mi archivo xml? – Avinash

+0

Agregue todos los $ marcadores desde dentro del alcance a la matriz $ nodesToDelete. –

4

Document Object Model (DOM) es la respuesta.

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

pero ¿cómo podría recorrer los archivos del archivo xml ..? – Avinash

+3

Al leer la documentación: http://de.php.net/manual/en/class.domelement.php – Bombe

+21

El objetivo de StackOverflow, en mi opinión, es ayudar a los usuarios dándoles ejemplos que puedan ayudarlos a resolver su problema. problema. No implica que no hayan leído o buscado en la documentación. –

Cuestiones relacionadas