node loadxml example child php xml dom

loadxml - php dom child node



Insertar datos en un archivo XML con PHP DOM (6)

Intentaba insertar datos nuevos en un archivo XML existente, pero no funciona. Aquí está mi archivo xml:

<list> <activity>swimming</activity> <activity>running</activity> <list>

Ahora, mi idea consistía en crear dos archivos: una página de índice, donde muestra lo que hay en el archivo y proporciona un campo para insertar nuevos elementos, y una página php que insertará los datos en el archivo XML. Aquí está el código para index.php:

<html> <head><title>test</title></head> </head> <?php $xmldoc = new DOMDocument(); $xmldoc->load(''sample.xml'', LIBXML_NOBLANKS); $activities = = $xmldoc->firstChild->firstChild; if($activities!=null){ while(activities!=null){ echo $activities->textContent.''<br/>''; activities = activities->nextSibling. } } ?> <form name=''input'' action=''insert.php'' method=''post''> insert activity: <input type=''text'' name=''activity''/> <input type=''submit'' value=''send''/> </form> </body> </html

y aquí está el código para insert.php:

<?php header(''Location:index.php''); $xmldoc = new DOMDocument(); $xmldoc->load(''sample.xml''); $newAct = $_POST[''activity'']; $root = $xmldoc->firstChild; $newElement = $xmldoc->createElement(''activity''); $root->appendChild($newElement); $newText = $xmldoc->createTextNode($newAct); $newElement->appendChild($newText); $xmldoc->save(''sample.xml''); ?>

El usuario debe acceder a index.php, donde vería una lista de las actividades actuales presentes en el archivo XML, y un campo de texto debajo donde puede insertar nuevas actividades. Al hacer clic en el botón Enviar, la página llamaría a insert.php, que contiene un código que abre el archivo XML en un árbol DOM, inserta un nuevo nodo debajo del nodo raíz y devuelve la llamada a la página index.php, donde el usuario debe estar capaz de ver la lista de actividades, su nueva actividad allí debajo de las demás. No está trabajando. Cuando hago clic en el botón para enviar una nueva entrada, las páginas se actualizan y aparentemente no pasa nada, el XML es el mismo que antes. ¿Qué hice mal? Además, me gustaría saber si hay una mejor manera de hacerlo.


¿Tu bloque de código está copiado y pegado de tus archivos existentes? si es así, veo dos posibles problemas:

<form name=''input'' action''insert.php'' method=''post''> // should be: <form name="input" action="insert.php" method="post">

nota: le falta action = "insert.php" , lo que haría que el formulario simplemente se recargara sin enviar, que es el comportamiento que describe.

en segundo lugar, asegúrese de tener permiso de escritura para "sample.xml". puede confirmar si realmente está escribiendo algo:

print ''I wrote ''.$xmldoc->save(''sample.xml'').'' bytes of data'';


$ newText = $ xmldoc-> createTextNode ($ newActv);

Cambiar esta línea a

$ newText = $ xmldoc-> createTextNode ($ newAct);


En realidad cometiste errores en dos lugares.

Esta línea debería ser, creo que debido al error tipográfico, te perdiste un signo igual. también

Estas líneas deberían ser

Pruébalo ahora, debería funcionar, Hop, esto tendría sentido


Solución final

sample.XML

<list> <activity>swimming</activity> <activity>running</activity> <activity>Jogging</activity> <activity>Theatre</activity> <activity>Programming</activity> </list>

index.php

<html> <head><title>test</title></head> </head> <?php $xmldoc = new DOMDocument(); $xmldoc->load("sample.xml", LIBXML_NOBLANKS); $activities = $xmldoc->firstChild->firstChild; if($activities!=null){ while($activities!=null){ echo $activities->textContent."<br/>"; $activities = $activities->nextSibling; } } ?> <form name="input" action="insert.php" method="post"> insert activity: <input type="text" name="activity"/> <input type="submit" value="send"/> </form> </body> </html>

insert.php

<?php header(''Location:index.php''); $xmldoc = new DOMDocument(); $xmldoc->load(''sample.xml''); $newAct = $_POST[''activity'']; $root = $xmldoc->firstChild; $newElement = $xmldoc->createElement(''activity''); $root->appendChild($newElement); $newText = $xmldoc->createTextNode($newAct); $newElement->appendChild($newText); $xmldoc->save(''sample.xml''); ?>


Creo que sé cuál es el problema con tu código. No debe escribir así: <?xml-stylesheet type="text/xsl" href="sample.xsl" ?> El código correcto es:

<?xml:stylesheet type="text/xsl" href="sample.xsl" ?>


este es el código que trabajo para mí.

index.php

<html> <head><title>test</title></head> </head> <?php $xmldoc = new DOMDocument(); $xmldoc->load(''sample.xml'', LIBXML_NOBLANKS); $activities = $xmldoc->firstChild->firstChild; if($activities!=null){ while($activities!=null){ echo $activities->textContent.''<br/>''; $activities = $activities->nextSibling; } } ?> <form name=''input'' action=''insert.php'' method=''post''> insert activity: <input type=''text'' name=''activity''/> <input type=''submit'' value=''send''/> </form> </body> </html> insert.php <?php header(''Location:index.php''); $xmldoc = new DOMDocument(); $xmldoc->load(''sample.xml''); $newAct = $_POST[''activity'']; $root = $xmldoc->firstChild; $newElement = $xmldoc->createElement(''activity''); $root->appendChild($newElement); $newText = $xmldoc->createTextNode($newAct); $newElement->appendChild($newText); $xmldoc->save(''sample.xml''); ?>

sample.xml

<list> <activity>swimming</activity> <activity>running</activity> </list>