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