Entradas con la etiqueta ‘xml’

PHP – Escribir un XML con CDATA Usando SimpleXML

Publicado por Iván Gajate el 26 de abril de 2011 en Desarrollo Web | 3 comentarios »

Si usamos la fantástica librería de PHP SimpleXML para leer y construir xml, nos habremos dado cuenta que no tiene soporte para meter datos en etiquetas CDATA, lo cual es un engorro.

Tras mucho buscar, he encontrado este truco que soluciona el problema :)

Consiste en extender la clase SimpleXml para ampliarla con DOM, que sí tiene soporte para CDATA, y devuelve un objeto SimpleXML :)

Así, si nos creamos una clase “SimpleXMLExtended.php

<?php
	class SimpleXMLExtended extends SimpleXMLElement {
	  public function addCDATA($cData) {
	    $node = dom_import_simplexml($this);
	    $no = $node->ownerDocument;
	    $node->appendChild($no->createCDATASection($cData));
	  }
	}
?>

Podemos crear un XML así:

<?php
	Header('Content-type: text/xml;  charset=utf-8'); 

	require_once('SimpleXMLExtended.php');

	$miXML = new SimpleXMLExtended('<?xml version="1.0" encoding="UTF-8"?><usuario></usuario>');
	$nombre = $miXML->addChild('nombre');
	$nombre->addCData('Iván Gajate');
	echo $miXML->asXML();
?>

Y devolverá esto:

<?xml version="1.0" encoding="UTF-8"?>
<usuario>
	<nombre><![CDATA[Iván Gajate]]></nombre>
</usuario>

AS3 – Sustituir un XML con Replace

Publicado por Iván Gajate el 10 de febrero de 2011 en AS3, Flash | No hay comentarios »

Yo hasta ahora para modificar un nodo de un xml sencillamente lo hacía así:

miXml.item = <item>Texto modificado</item>

El problema me ha surgido cuando he querido meter el nuevo contenido dentro de un CDATA, pues me truncaba el “<” y “>” a formato html, y claro, no funcionaba.

La solución, sustituir el nodo completo con replace:

var miXml:XML = <nodos>
			<item><![CDATA[texto a modificar]]></item>
		</nodos>

var nuevoNodo:XML = new XML("<item><![CDATA[imágen1.jpg]]></item>");
miXml.replace("item", nuevoNodo);

trace(miXml);

//<nodos>
//  <item><![CDATA[imágen1.jpg]]></item>
//</nodos>

Esto viene muy bien cuando el contenido se cambia por el valor de una variable, en un bucle recorriendo todos los nodos.

AS3 – xml.getElementsByClass

Publicado por Iván Gajate el 28 de abril de 2010 en AS3, Flash, Tutoriales | No hay comentarios »

Y la compañera de getElementsByName y getElementById es esta.

Supongamos que tenemos un xml con varios nodos con la misma definición de clase:

<div>
	<p class="parrafo">
		Esto es un párrafo
	</p>
	<form>
		<input type="checkbox" id="chk0">Leer</input> <br />
		<input type="checkbox" id="chk1">Montar en bici</input> <br />
		<input type="checkbox" id="chk2">Dormir</input> <br />
	</form>
	<p class="parrafo">
		Esto es otro párrafo diferente, pero con la misma clase
	</p>
</div>

Y queremos recuperarlos en forma de XMLList:

function getElementsByClass(data:XML, className:String):XMLList{
	return data.descendants().(hasOwnProperty("@class") && attribute("class")==className);
}

// Se usaria asi:
getElementsByClass(miXml, "parrafo");

Y devolvería esto:

<p class="parrafo">Esto es un párrafo</p>
<p class="parrafo">Esto es otro párrafo diferente, pero con la misma clase</p>

Este tipo de funciones las voy a ir recopilando en una clase XmlUtils.

AS3 – xml.getElementsByName

Publicado por Iván Gajate el 15 de abril de 2010 en AS3, Flash, Tutoriales | 2 comentarios »

La parejita de getElementById ;)

Muy útil por ejemplo para obtener todos los checkBox de un xml:

<div>
	<form id="aficiones">
		<input type="checkbox" id="chk0" name="c0">Leer</input> <br />
		<input type="checkbox" id="chk1" name="c1">Montar en bici</input> <br />
		<input type="checkbox" id="chk2" name="c2">Dormir</input> <br />
	</form>
</div>

En este caso lo que nos interesa es un listado (XMLList) con todos los nodos del mismo tipo.

function getElementsByName(data:XML, name:String):XMLList{
	return data.descendants(name);
}

// Se usaria asi:
getElementsByName(miXml, "input");

Este tipo de funciones las voy a ir recopilando en una clase XmlUtils.

AS3 – xml.getElementById

Publicado por Iván Gajate el 13 de abril de 2010 en AS3, Flash | 2 comentarios »

Si tenemos un xml con etiquetas anidadas como esta:

<contenedor>
	<caja>
		<item id="expediente1">
			Contenido del expediente 1
		</item>
	</caja>
	<caja>
		<item id="expediente2">
			Contenido del expediente 2
		</item>
	</caja>
</contenedor>

Y queremos acceder directamente al nodo <item id=”expediente1”> podemos hacerlo con esta línea de E4X:

miXml.descendants().(hasOwnProperty("@id") && @id == "expediente1")[0]

Es fácil de entender, nos devolverá un XMList con todos los nodos que tengan el atributo “id”  y que id==”expediente1”. Y de ese nos quedamos con el primero.

Podemos meterla en una función para que sea más cómoda de usar:

function getElementById(data:XML, id:String):XML{
	return data.descendants().(hasOwnProperty("@id") && @id==id)[0];
}

// Se usaria asi:
getElementById(miXml, "expediente1");

La solución me la ha dado Joseba en la lista de AsNativos.

Este tipo de funciones las voy a ir recopilando en una clase XmlUtils.