[ad_1]
Em algum momento do desenvolvimento de um aplicativo Mule, é quase inevitável que você precise manipular XML.
Neste artigo, ensinarei como ler XML usando scripts DataWeave e como modificar sua codificação, espaços para nome, campos e atributos com o objetivo de gerar uma saída de documento JSON.
Contents
Começando
Para começar, precisamos de alguns dados XML de amostra como entrada para a transformação DataWeave que escreveremos.
Dados XML de amostra
Neste artigo, usaremos o seguinte snippet de dados XML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28. |
xml versão=“1.0” codificação=“ISO-8859-1”?> <simpsons:família xmlns:simpsons=“http://training.mulesoft.com/simspons”> <simpsons:membro can_vote=“verdade”> <simpsons:último–nome>Simpson</simpsons:último–nome> <simpsons:primeiro–nome>Homer</simpsons:primeiro–nome> <simpsons:era>39.</simpsons:era> </simpsons:membro> <simpsons:membro can_vote=“falso”> <simpsons:último–nome>Simpson</simpsons:último–nome> <simpsons:primeiro–nome>Lisa</simpsons:primeiro–nome> <simpsons:era>8</simpsons:era> </simpsons:membro> <simpsons:membro can_vote=“falso”> <simpsons:último–nome>Simpson</simpsons:último–nome> <simpsons:primeiro–nome>Bart</simpsons:primeiro–nome> <simpsons:era>10</simpsons:era> </simpsons:membro> <simpsons:membro can_vote=“verdade”> <simpsons:último–nome>Simpson</simpsons:último–nome> <simpsons:primeiro–nome>Marge</simpsons:primeiro–nome> <simpsons:era>36.</simpsons:era> </simpsons:membro> <simpsons:membro can_vote=“falso”> <simpsons:último–nome>Simpson</simpsons:último–nome> <simpsons:primeiro–nome>Maggie</simpsons:primeiro–nome> <simpsons:era>1</simpsons:era> </simpsons:membro> </simpsons:família> |
Vamos começar extraindo metadados da amostra XML: o tipo de codificação e o espaço para nome.
Extraia o tipo de codificação
Para extrair o tipo de codificação do XML, infelizmente não há solução elegante. O que é necessário é uma expressão DataWeave para converter a carga útil usando a análise bruta e, em seguida, procurá-la com uma expressão regular.
Expressão DataWeave:
% dw 2,0
aplicativo de saída / json
—
{
codificação: (((carga útil. ^ raw como String) scan / encoding = “([A-z0-9-]+) “/)[0][1] )
}
%dw 2.0 resultado inscrição/json –– { codificação: (((carga útil.^cru Como Corda) Varredura /codificação=“([A-z0-9-]+) “/)[[0 0][[1] ) } |
Saída DateWeave:
{
“codificação”: “ISO-8859-1”
}
{ “codificação”: “ISO-8859-1” } |
Extraia o aNamespace
O DataWeave suporta totalmente os namespaces XML. Um espaço para nome XML é um mecanismo recomendado pelo W3C que evita conflitos de nome, diferenciando elementos ou atributos XML que podem ter nomes idênticos, mas com definições diferentes.
Para extrair o espaço para nome de um elemento XML, use o símbolo de hash “#. ”
Expressão DataWeave:
% dw 2,0
aplicativo de saída / json
—
{
encoding: (((carga útil. ^ raw como String) scan / encoding = ‘([A-z0-9-]+) ‘/)[0][1] ),
espaço de nome: payload.family. #
}
%dw 2.0 resultado inscrição/json –– { codificação: (((carga útil.^cru Como Corda) Varredura /codificação=‘([A-z0-9-]+) ‘/)[[0 0][[1] ), espaço de nome: carga útil.família.# } |
Saída do DataWeave:
{
“codificação”: “ISO-8859-1”,
“namingspace”: “http://training.mulesoft.com/simpsons”
}
{ “codificação”: “ISO-8859-1”, “espaço para nome”: “http://training.mulesoft.com/simpsons” } |
Transformando campos XML
Ao transformar XML em JSON, você pode encontrar algumas dificuldades:
- O XML permite apenas um elemento raiz, enquanto o JSON permite vários.
- Não há conceito de matriz em XML (apenas elementos repetidos), no entanto, a estrutura de dados JSON é baseada em matrizes e objetos.
Para superar esses problemas, o DataWeave fornece as seguintes soluções:
- Para transformar elementos XML repetidos em uma matriz JSON, use o asterisco “* ” Seletor DataWeave para criá-lo.
- Como o JSON pode ter vários elementos raiz, você não precisa fazer nada específico para gerar a saída.
Expressão DataWeave:
% dw 2,0
aplicativo de saída / json
—
payload.family. * membro
%dw 2.0 resultado inscrição/json –– carga útil.família.*membro |
Saída do DataWeave:
[[ { “último nome”: “Simpson”, “primeiro nome”: “Homer”, “era”: “39” }, { “último nome”: “Simpson”, “primeiro nome”: “Lisa”, “era”: “8” }, { “último nome”: “Simpson”, “primeiro nome”: “Bart”, “era”: “10” }, { “último nome”: “Simpson”, “primeiro nome”: “Marge”, “era”: “36” }, { “último nome”: “Simpson”, “primeiro nome”: “Maggie”, “era”: “1” } ] |
Para especificar seu formato de saída, você precisa iterar sobre os itens em sua matriz. Isso pode ser alcançado com o mapa função.
Cuidado, alguns campos contêm o símbolo de traço “-,”Significa que você não pode acessar os campos com a notação de ponto. Use a notação de matriz $[“field-name”].
Expressão DataWeave:
% dw 2,0
aplicativo de saída / json
—
payload.family. * mapa dos membros
{
lastName: $[“last-name”],
firstName: $[“first-name”],
age: $ .age
}
%dw 2.0 resultado inscrição/json –– carga útil.família.*membro mapa { último nome: $[[“último nome”], primeiro nome: $[[“primeiro nome”], era: $.era } |
Saída do DataWeave:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[[ { “último nome”: “Simpson”, “primeiro nome”: “Homer”, “era”: “39” }, { “último nome”: “Simpson”, “primeiro nome”: “Lisa”, “era”: “8” }, { “último nome”: “Simpson”, “primeiro nome”: “Bart”, “era”: “10” }, { “último nome”: “Simpson”, “primeiro nome”: “Marge”, “era”: “36” }, { “último nome”: “Simpson”, “primeiro nome”: “Maggie”, “era”: “1” } ] |
Transformando atributos XML
A especificação XML permite que atributos sejam definidos para elementos, mas a especificação JSON não possui um equivalente direto. O DataWeave fornece um mecanismo que permite a leitura de atributos de um elemento XML usando o método @ símbolo seguido pela tecla
O script DataWeave abaixo extrai informações de atributo da amostra XML e as converte em JSON.
Expressão DataWeave:
% dw 2,0
aplicativo de saída / json
—
payload.family. * mapa dos membros
{
lastName: $[“last-name”],
firstName: $[“first-name”],
idade: $. idade,
canVote: $. @ can_vote
}
%dw 2.0 resultado inscrição/json –– carga útil.família.*membro mapa { último nome: $[[“último nome”], primeiro nome: $[[“primeiro nome”], era: $.era, canVote: $.@pode_voto } |
Saída do DataWeave:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28. 29 30 31 32. |
[[ { “último nome”: “Simpson”, “primeiro nome”: “Homer”, “era”: “39”, “canVote”: “verdade” }, { “último nome”: “Simpson”, “primeiro nome”: “Lisa”, “era”: “8”, “canVote”: “falso” }, { “último nome”: “Simpson”, “primeiro nome”: “Bart”, “era”: “10”, “canVote”: “falso” }, { “último nome”: “Simpson”, “primeiro nome”: “Marge”, “era”: “36”, “canVote”: “verdade” }, { “último nome”: “Simpson”, “primeiro nome”: “Maggie”, “era”: “1”, “canVote”: “falso” } ] |
No artigo anterior, você viu como gerar XML a partir de JSON, agora você pode gerar JSON a partir de XML.
Se você quiser saber mais sobre o DataWeave 2.0, pode se registrar no curso DataWeave.
[ad_2]