Conversão de XML para JSON

Zend_Json fornece um conveniente método para transformar dados formatados em XML para o formato JSON. Este recurso foi inspirado em um artigo do IBM developerWorks.

Zend_Json inclui uma função estática chamada Zend_Json::fromXml(). Esta função irá gerar um JSON a partir de uma entrada em XML. Esta função recebe qualquer string arbitrária em XML como um parâmetro de entrada. Tem também um parâmetro de entrada opcional do tipo booleano que instrui a lógica de conversão para ignorar ou não os atributos XML durante o processo de conversão. Se esse parâmetro de entrada opcional não é dado, então o comportamento padrão é ignorar os atributos XML. Esta chamada de função é feita como mostrado abaixo:

// a função fromXml simplesmente recebe uma String contendo conteúdo
// em XML como entrada.
$jsonContents = Zend_Json::fromXml($xmlStringContents, true);

A função Zend_Json::fromXml() faz a conversão da string formata em XML do parâmetro de entrada e retorna o equivalente como uma string formatada em JSON. No caso de qualquer erro de formatação do XML ou erro na lógica de conversão, esta função irá lançar uma exceção. A lógica de conversão também utiliza técnicas recursivas para percorrer a árvore XML. Ele suporta até 25 níveis de profundidade de recursão. Se passar dessa profundidade, será lançado um Zend_Json_Exception. Existem vários arquivos XML com vários graus de complexidade fornecidos no diretório de testes de Zend Framework. Eles podem ser usados para testar a funcionalidade do recurso xml2json.

O simples exemplo a seguir mostra uma string XML passada como entrada e uma string JSON de saída retornada como resultado da função Zend_Json::fromXml(). Este exemplo usa o parâmetro opcional da função para não ignorar os atributos XML durante a conversão. Consequentemente, você pode notar que a string JSON resultante inclui uma representação dos atributos XML presentes na string XML de entrada.

String XML passada como entrada para a função 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>

String JSON de saída retornada da função 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"
      }
   ]}
}

Changes

Changes in 1.11.6

Starting from the release 1.11.6 the Zend_Json::fromXml() function has been rewritten from scratch in order to manage XML element with attributes, text value and sub-elements (see the ZF-3257).

For instance, if you have an XML document like this:

<?xml version="1.0" encoding="UTF-8"?>
<a>
    <b id="foo"/>
    bar
</a>

The JSON output string returned from Zend_Json::fromXml() is:

{
   "a" : {
      "b" : {
         "@attributes" : {
            "id" : "foo"
         }
      },
      "@text" : "bar"
   }
}

The idea is to use a special key value (@text) to store the text value of an XML element, only if this element contains attributes or sub-elements (as in the previous examples). If you have a simple XML element with only a text value, like this:

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

the JSON will be {"a":"foo"} that is quite intuitive, instead of {"a":{"@text":"foo"}}.