2011-08-17 8 views
7

Tengo un archivo XML que se parece a esto:cómo anexar a un archivo XML con PHP preferiblemente con SimpleXML

<?xml version="1.0" encoding="utf-8"?> 
<data> 
    <config> 
    </config> 

    <galleries> 
     // We have loads of these <gallery> 
     <gallery> 
      <name>Name_Here</name> 
      <filepath>filepath/file.txt</filepath> 
      <thumb>filepath/thumb.png</thumb> 
     </gallery> 
    </galleries> 
</data> 

He estado tratando de averiguar cómo anexar otra galería <> a mi XML arriba archivo. Intenté usar el archivo simplex pero no pude hacerlo funcionar, así que probé este answer y también un bunch en stackoverflow. Pero simplemente no puedo hacer que funcione.
Puedo leer fácilmente un archivo xml y obtener toda la información que necesito, pero necesito poder añadirle una etiqueta de galería. El código siguiente no funciona y, cuando lo hace, solo puedo insertar 1 elemento, y lo inserta 3 veces, no entiendo esto.

$data = 'xml/config.xml'; 
// Load document 
$xml = new DOMDocument; 
$xml->load($data); #load data into the element 

$xpath = new DOMXPath($xml); 
$results = $xpath->query('/data/galleries'); 
$gallery_node = $results->item(0); 

$name_node = $xml->createElement('name'); 
$name_text = $xml->createTextNode('nametext'); 

$name_node = $name_node->appendChild($name_text); 

$gallery_node->appendChild($name_node); 

echo $xml->save($data); 

He tenido un montón de intentos fallidos en esto, esto debería ser tan fácil. Básicamente, quiero agregar una galería con childs nombre filepath y thumb a este mismo archivo (xml/config.php).

Como dije, lo hice funcionar, pero no está formateado y no tiene la etiqueta de la galería.

Pregunta
¿Cómo se inserta otra galería <> (con niños) en el archivo XML anterior?
Preferiblemente incluso utilizando simplexml

Respuesta

14

Con SimpleXML, puede utilizar el método addChild().

$file = 'xml/config.xml'; 

$xml = simplexml_load_file($file); 

$galleries = $xml->galleries; 

$gallery = $galleries->addChild('gallery'); 
$gallery->addChild('name', 'a gallery'); 
$gallery->addChild('filepath', 'path/to/gallery'); 
$gallery->addChild('thumb', 'mythumb.jpg'); 

$xml->asXML($file); 

Tenga en cuenta que SimpleXML no va a "formato" del XML para usted, sin embargo al pasar de una representación SimpleXML sin formato XML para sangría claramente no es un paso complicado y está cubierto de mucha de preguntas aquí .

+0

¡Esto funciona! pero lo emite 3 veces en mi xml, ¿alguna idea de por qué haría esto? produce 3 juegos de y niños en la misma línea. ¿Lo hizo con mi script anterior también? ¿alguna pista? – Anil

+2

Probablemente estás haciendo algo mal en un bucle. Nada de lo que hayas mostrado, o que haya dado, repetirá el elemento de la galería tres veces. – salathe