Zend_Json proporciona un método de conveniencia para transformar
datos con formato XML a formato JSON. Esta funcionalidad se
inspiró en un
artículo de IBM developerWorks.
Zend_Json incluye una función estática llamada
Zend_Json::fromXml(). Esta función genera
JSON a partir de una entrada XML dada. Esta función toma como parámetro de entrada cualquier
cadena XML arbitraria. También toma un parámetro de entrada booleano opcional
para indicar a la lógica de conversión que ignore o no ignore los
atributos XML durante el proceso de conversión. Si no se proporciona este parámetro
de entrada opcional, el comportamiento por defecto es ignorar los atributos XML.
Esta llamada a la función se realiza como se muestra a continuación:
// fromXml function simply takes a String containing XML contents // as input. $jsonContents = Zend_Json::fromXml($xmlStringContents, true);
La función Zend_Json::fromXml() realiza la conversión del
parámetro de entrada de cadena con formato XML y devuelve la salida de cadena
equivalente con formato JSON. En caso de cualquier error de formato de entrada
XML o error en la lógica de conversión, esta función lanzará una excepción. La
lógica de conversión también utiliza técnicas recursivas para recorrer el árbol XML.
Admite recursión hasta 25 niveles de profundidad. Más allá de esa profundidad, lanzará una
Zend_Json_Exception. Existen varios archivos XML
con distintos grados de complejidad proporcionados en el directorio de pruebas de Zend Framework. Pueden
usarse para probar la funcionalidad de xml2json.
A continuación se muestra un ejemplo sencillo que presenta tanto la cadena de entrada XML
pasada a la función Zend_Json::fromXml() como la cadena de salida
JSON devuelta como resultado. Este ejemplo utilizó el parámetro de función
opcional para no ignorar los atributos XML durante la
conversión. Por lo tanto, puede observar que la cadena JSON resultante incluye
una representación de los atributos XML presentes en la
cadena de entrada XML.
Cadena de entrada XML pasada a la función Zend_Json::fromXml():
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book id="1">
<title>Code Generation in Action</title>
<author><first>Jack</first><last>Herrington</last></author>
<publisher>Manning</publisher>
</book>
<book id="2">
<title>PHP Hacks</title>
<author><first>Jack</first><last>Herrington</last></author>
<publisher>O'Reilly</publisher>
</book>
<book id="3">
<title>Podcasting Hacks</title>
<author><first>Jack</first><last>Herrington</last></author>
<publisher>O'Reilly</publisher>
</book>
</books>
Cadena de salida JSON devuelta por la
función Zend_Json::fromXml():
{
"books" : {
"book" : [ {
"@attributes" : {
"id" : "1"
},
"title" : "Code Generation in Action",
"author" : {
"first" : "Jack", "last" : "Herrington"
},
"publisher" : "Manning"
}, {
"@attributes" : {
"id" : "2"
},
"title" : "PHP Hacks", "author" : {
"first" : "Jack", "last" : "Herrington"
},
"publisher" : "O'Reilly"
}, {
"@attributes" : {
"id" : "3"
},
"title" : "Podcasting Hacks", "author" : {
"first" : "Jack", "last" : "Herrington"
},
"publisher" : "O'Reilly"
}
]}
}
A partir de la versión 1.11.6, la función Zend_Json::fromXml()
ha sido reescrita desde cero para gestionar elementos XML con atributos, valor de texto
y subelementos (véase ZF-3257).
Por ejemplo, si tiene un documento XML como este:
<?xml version="1.0" encoding="UTF-8"?>
<a>
<b id="foo"/>
bar
</a>
La cadena de salida JSON devuelta por
Zend_Json::fromXml() es:
{
"a" : {
"b" : {
"@attributes" : {
"id" : "foo"
}
},
"@text" : "bar"
}
}
La idea es utilizar un valor de clave especial (@text) para almacenar el valor de texto de un elemento XML, solo si dicho elemento contiene atributos o subelementos (como en los ejemplos anteriores). Si tiene un elemento XML simple con solo un valor de texto, como este:
<?xml version="1.0" encoding="UTF-8"?> <a>foo</a>
el JSON será {"a":"foo"}, lo cual es bastante intuitivo, en lugar de {"a":{"@text":"foo"}}.