Foros del Web » Programando para Internet » PHP »

Modificar XML con DOMDocument

Estas en el tema de Modificar XML con DOMDocument en el foro de PHP en Foros del Web. Buenas a todos, explico la duda, tengo un documento como el que sigue de xml: <?xml version="1.0" encoding="UTF-8"?> <noticias> <nuevanoticia valor="300520111306777421"> <usuarioadmin>Ale</usuarioadmin> <titulo><![CDATA[11111111111]]></titulo> <subtitulo><![CDATA[2222222222222]]></subtitulo> <imagenpath><![CDATA[../img/Ale ...
  #1 (permalink)  
Antiguo 11/06/2011, 12:13
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Pregunta Modificar XML con DOMDocument

Buenas a todos, explico la duda, tengo un documento como el que sigue de xml:

<?xml version="1.0" encoding="UTF-8"?>

<noticias>

<nuevanoticia valor="300520111306777421">
<usuarioadmin>Ale</usuarioadmin>
<titulo><![CDATA[11111111111]]></titulo>
<subtitulo><![CDATA[2222222222222]]></subtitulo>
<imagenpath><![CDATA[../img/Ale Guerrero!!!.jpg]]></imagenpath>
<articulo><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ante velit, mattis ut dapibus in, auctor a tortor. Donec nisl massa, facilisis quis faucibus eu, aliquet eget lectus. ]]></articulo>
</nuevanoticia>

<nuevanoticia valor="300520111306777488">
<usuarioadmin>Ale</usuarioadmin>
<titulo><![CDATA[5555555555]]></titulo>
<subtitulo><![CDATA[66666666666666]]></subtitulo>
<imagenpath><![CDATA[../img/Ale Guerrero!!!.jpg]]></imagenpath>
<articulo><![CDATA[In suscipit ante vitae leo feugiat eu tempus magna lacinia. Donec eget orci urna. Duis eu velit at diam posuere pretium. Nulla dolor justo, sollicitudin dignissim cursus sed, egestas nec metus. Mauris tristique mollis massa nec iaculis. In in odio leo, ullamcorper interdum dui. Nam viverra ligula sodales mauris convallis non vestibulum nunc volutpat. ]]></articulo>
</nuevanoticia>

<nuevanoticia valor="020620111307035467">
<usuarioadmin>Ale</usuarioadmin>
<titulo><![CDATA[6666666666]]></titulo>
<subtitulo><![CDATA[777777777777]]></subtitulo>
<imagenpath><![CDATA[../img/Ale Guerrero!!!.jpg]]></imagenpath>
<articulo><![CDATA[Escriba lo que desee aquí]]></articulo>
</nuevanoticia>

<nuevanoticia valor="020620111307035565">
<usuarioadmin>Ale</usuarioadmin>
<titulo><![CDATA[77777777777]]></titulo>
<subtitulo><![CDATA[888888888888]]></subtitulo>
<imagenpath><![CDATA[../img/Ale Guerrero!!!.jpg]]></imagenpath>
<articulo><![CDATA[Nullam pretium congue porttitor. In sollicitudin, felis eget faucibus condimentum, nisi diam dictum dolor, eget viverra velit ligula consequat est. Vivamus sem arcu, cursus sed eleifend a, semper a massa. Proin vulputate pellentesque erat, id bibendum tellus vulputate ut. Nam lectus ligula, tempor non gravida sit amet, imperdiet lacinia leo. ]]></articulo>
</nuevanoticia>

<nuevanoticia valor="020620111307035589">
<usuarioadmin>Ale</usuarioadmin>
<titulo><![CDATA[888888888888]]></titulo>
<subtitulo><![CDATA[999999999999999]]></subtitulo>
<imagenpath><![CDATA[../img/Ale Guerrero!!!.jpg]]></imagenpath>
<articulo><![CDATA[Escriba lo que desee aquíEtiam ut ante non mi hendrerit auctor quis id sapien. Suspendisse velit est, vestibulum non commodo venenatis, suscipit eget odio. . ]]></articulo>
</nuevanoticia>

</noticias>

y con php y domdocument quiero modificar uno de los nodos. como ya habrán visto, los nodos tienen un identificador que es un atributo llamado "valor" y cada uno tiene un valor que no se repite. para hacer la modificacion de uno de los nodos "nuevanoticia", lo que hago es con un formulario mustro lo que hay actualmente y luego, recopilo las modificaciones que se hayam hecho y reemplazo el nodo (o al menos esa es la idea). si bien el nodo a modificar puedo localizarlo y mostrarlo, cuando quiero reemplazarlo es cuando empiezan los problemas. lo que hago es construirlo de nuevo y el reemplazar el nodo viejo con el nuevo, usando la siguiente sentencia:

*******$archivonoticia->replaceChild($nodoantiguo, $nuevonodo);********

donde "$archivonoticia" es el resultado de:

$archivonoticia = new DOMDocument("1.0", "UTF-8");
$archivonoticia->load($archivoamodificar);

cuando trato de modificar me tira el siguiente error:

Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in C:\wamp\www\DIARIO PHP & XML (de casa)\modinews.php on line 115

seguido de:

DOMException: Not Found Error in C:\wamp\www\DIARIO PHP & XML (de casa)\modinews.php on line 115

donde la linea 115 es la que indico con asteriscos más arriba. desde ya gracias por la atención, salud gente!
  #2 (permalink)  
Antiguo 11/06/2011, 14:10
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 3 meses
Puntos: 1532
Respuesta: Modificar XML con DOMDocument

¿no te convendría usar mejor SimpleXML?
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 13/06/2011, 04:16
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Modificar XML con DOMDocument

Cita:
Iniciado por maycolalvarez Ver Mensaje
¿no te convendría usar mejor SimpleXML?
quizás, pero ahora mismo aparte de que necesito que funcione con DomDocument, quiero saber qué falla (por pura curiosidad)...
  #4 (permalink)  
Antiguo 13/06/2011, 04:37
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Modificar XML con DOMDocument

DOMDocument::replaceChild, recibe como primer parámetro el nodo nuevo y como segundo el nodo antiguo, los tienes cambiados, podría ser algo así:

Código PHP:
Ver original
  1. $nodoantiguo->parentNode->replaceChild($nuevonodo, $nodoantiguo);

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 13/06/2011, 04:56
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Modificar XML con DOMDocument

Cita:
Iniciado por masterpuppet Ver Mensaje
DOMDocument::replaceChild, recibe como primer parámetro el nodo nuevo y como segundo el nodo antiguo, los tienes cambiados, podría ser algo así:

Código PHP:
Ver original
  1. $nodoantiguo->parentNode->replaceChild($nuevonodo, $nodoantiguo);

Saludos.
en mi caso particular, el "parentNode" es necesario porque voy a cambiar al hijo directo del root y este a su vez tiene muchos hijos, no? porque si fuera cambiar uno de los nodos, por ejemplo "título", lo de parent no haría falta, no?
  #6 (permalink)  
Antiguo 13/06/2011, 05:21
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Modificar XML con DOMDocument

ok, ya lo modifiqué, y quedó de la siguiente forma:

$archivonoticia->$nodoantiguo->parentNode->replaceChild($nodoantiguo, $nuevanoticia);

pero ahora me da otro error en esta misma linea, que estoy seguro que se genera al momento de ubicar el nodo a reemplazar. el error es:

Catchable fatal error: Object of class DOMAttr could not be converted to string in C:\wamp\www\DIARIO PHP & XML (de casa)\modinews.php on line 115

para localizar el nodo a reemplazar hice lo siguiente (quizás me faltó algo, o directamente hice cualquiera!):

$notiamodif->load($notipath);
$root=$notiamodif->getElementsByTagName("noticias");
foreach($root as $news){
$recnewnews=$news->getElementsByTagName("nuevanoticia");
foreach($recnewnews as $elem){
$locatenews=$elem->getAttribute("valor");
if($locatenews==$idnoticia){
*****$nodoantiguo=$elem->getAttributeNode("valor");*****
$elemtitulo=$elem->getElementsByTagName("titulo");
$elemsubtitulo=$elem->getElementsByTagName("subtitulo");
$elemarticulo=$elem->getElementsByTagName("articulo");
$elemimagen=$elem->getElementsByTagName("imagenpath");
$etit=utf8_decode($elemtitulo->item(0)->nodeValue);
$esubtit=utf8_decode($elemsubtitulo->item(0)->nodeValue);
$eart=utf8_decode($elemarticulo->item(0)->nodeValue);
$eimg=utf8_decode($elemimagen->item(0)->nodeValue);

la sentencia con la que intento localizar el nodo a reemplazar esta con ***** de los dos lados. es la unica forma que se me ocurrio, porque también se me había ocurrido con:

$nodoatiguo=$elem->getParent(0); pero me dice que la no está definida esa función (si, seguramente me la inventé yo en la desesperación por que esto funciones, pero a veces me da resultado). en fin, ven algo que no cierre del todo??? gracias gente!!!
  #7 (permalink)  
Antiguo 13/06/2011, 09:41
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Modificar XML con DOMDocument

ya esta, al final era una boludez (bueno, boludez para el que sabe verlo, yo llevo 4 hs luchado). dentro del mismo archivo donde recopilaba los nuevos datos para reemplazar el nodo, puse un "localizador" del nodo a reemplazar, que era mas o menos lo mismo que el que lo leia para mostrarlo y modificarlo, con un detalle que ahora señalo, esto es lo que agregué:

$root=$archivonoticia->getElementsByTagName("noticias");
foreach($root as $news){
$recnewnews=$news->getElementsByTagName("nuevanoticia");
foreach($recnewnews as $elem){
$locatenews=$elem->getAttribute("valor");
if($locatenews==$idnoticia){
$nodoantiguo=$recnewnews->item(0);
}
}
}

y el detalle, para hacer referencia al nodo en particular que quería reemplazar es la ultima linea (porque todos los nodos son iguales, salvo que todos tienen un atributo que no se repite, pero el nombre del nodo es siempre el mismo y los hijos de ese nodo tambien son iguales para todos, por lo que encontrar el nodo se me habia complidcado..., hasta ahora!

Etiquetas: domdocument, modificar, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:44.