TigerZF
🌐Español

39.4. Conversión de XML a JSON

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"
      }
   ]}
}

39.4.1. Cambios

39.4.1.1. Cambios en la versión 1.11.6

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"}}.