XML no atributo de outro XML

4

Hoje, outro desenvolvedor conversou comigo sobre como ele abordou um problema no qual ele estava trabalhando. A solução encontrada por ele foi inserir uma cadeia de XML com escape no atributo de outro elemento XML. Na minha cabeça eu estava gritando "Isso é seguro e sábio para fazer ???". Segundo ele, isso foi feito em toneladas de outros projetos dentro da empresa que transmitem XML de um lado para o outro.

A minha pergunta é esta -

  1. Isso é uma coisa segura / inteligente para fazer (xml em um atributo xml)?
  2. Se não, devo mencionar isso? eu tenho só foi com a empresa por 2 anos e tenho notado muitas coisas que estão apenas pedindo uma grande catástrofe acontecer um dia (ambos e não em projetos em que trabalho). Eu não quero ser aquele que sempre diz que eles estão fazendo coisas erradas ...

Quaisquer pensamentos seriam muito apreciados!

FYI - INFORMAÇÕES ATUALIZADAS RE: APLICATIVO - O Flash está chamando essa API e analisando o XML que recebe na resposta. Eu não acho que o Flash está usando XPath ou qualquer coisa, apenas a análise de string (mas eu posso estar errado). Eu não trabalho no aspecto Flash, então não sei onde procurar (nem eu entenderia).

    
por Dan Appleyard 20.01.2011 / 23:21
fonte

7 respostas

8

Se você escapar corretamente do XML interno, isso pode funcionar. Eu não vou apostar em quanto tempo antes que você encontre problemas estranhos com a fuga, no entanto.

Pessoalmente, acho que é uma coisa muito estranha de se fazer, e acho que isso causará muita confusão na minha cabeça. Mais importante (talvez), significa que você não pode usar o material padrão para mexer diretamente com o XML "interno" - você sempre terá que retirá-lo, desafogá-lo e, em seguida, poderá enganá-lo. Heck, você não pode aplicar XPATHs que funcionem com o XML interno, muito menos algo como XSLT.

Eu não faria isso, mas não sei o problema, então não posso ter certeza de que não é a melhor solução disponível em um campo de soluções realmente horríveis.

    
por 20.01.2011 / 23:40
fonte
5

Nossa, essa é uma maneira totalmente errada de fazer as coisas ... Claro que pode funcionar, mas por quê?

Acabou de adicionar um nível totalmente novo de escape e análise que nenhuma outra ferramenta no mundo pode processar. E se você precisar usar uma transformação XSLT? Como você usa o XPATH? É apenas um trabalho extra para recuperar os dados sem qualquer benefício real.

A maneira correta de fazer isso é colocá-lo como um sub-elemento do elemento, o que permite que você coloque ... surpreendentemente ... mais XML. Agora só é analisado uma vez, você não se preocupa em escapar e analisar duas vezes, e qualquer ferramenta XML poderá ler a estrutura.

A única reclamação que posso ver sobre isso é se o conteúdo do elemento XML tiver um conteúdo de nó de texto simples. Nesse caso, simplesmente mova o texto para outro subelemento. Deve ser bem simples atualizar qualquer referência XPATH a ele.

    
por 20.01.2011 / 23:57
fonte
2

Se o XML com escape segue um formato específico Use um esquema para definir esse formato e colocá-lo onde ele pertence como outro elemento. A partir dos sons das coisas, o aplicativo não está usando um esquema e a análise é feita à mão ... há muitos formatos mais adequados para transmitir dados do que XML, então acho que minha pergunta é por que o programa está usando XML o primeiro lugar.

Parece que há muita coisa errada, mas sem conhecimento em primeira mão. Não pude começar a sugerir como corrigir isso.

    
por 21.01.2011 / 00:49
fonte
1
  1. Ele quebrará o formato dos dados, a menos que, a menos que o HTML codifique o XML interno, ele funcione.

  2. É provavelmente seguro, mas ... estranho. Há sempre uma maneira melhor.

A única razão válida em que consigo pensar é a tentativa de passar informações extras ou novas sobre uma interface que não pode ser alterada / estendida por algum motivo. Então você tem que encontrar uma maneira de "espremer" novos dados em um formato antigo. Talvez seja uma interface antiga e estabelecida, que foi exaustivamente testada, aprovada e certificada. O custo de mudá-lo seria imenso.

Fora isso ... bem ... estranho como eu disse ...

    
por 20.01.2011 / 23:26
fonte
1

Este é um indicador claro, que a marcação externa é falha e, portanto, deve ser corrigida.
Atributos XML são destinados a valores planos.

Claro que você pode fazer isso. O SVG mostra que você pode até mesmo fazer um padrão, embora haja benefícios claros nesse caso.

No seu caso, no entanto, os dados em questão devem ser um filho em vez de um atributo. Ponto final.

    
por 12.06.2011 / 00:15
fonte
1

Eu fiz exatamente isso e quero explicar em que sentido isso estava correto.

Eu estava usando uma estrutura que duplica dados em uma rede. Um servidor mantém os dados. Os clientes podem se inscrever em uma visualização dos dados. Eles recebem o estado atual e são posteriormente notificados de quaisquer alterações. Mudanças seriam adicionar ou remover uma entidade de dados, definir um valor de campo de entidade ou definir uma relação entre entidades.

O estado atual e os dados foram codificados em XML. Por exemplo, se um produto for reservado e a disponibilidade for alterada, o cliente poderá receber uma atualização como:

<upd type="product" id="678" available="19" reserved="1" />

Todos os valores dos campos primitivos são dados como atributos.

O que aconteceu então é que um campo vindo do DB continha XML. Ele foi armazenado como uma string XML porque apenas o cliente precisava interpretá-lo. Assim, o XML, como qualquer string, foi escapado e passado corretamente como um atributo.

Moralidade

Não há nada errado, é apenas isolamento entre duas camadas.

A camada inferior transporta strings, entre outras coisas, e representa as strings como atributos XML. A camada superior necessária para transportar XML e, naturalmente, usou a representação de string de XML. O efeito combinado é que você obtém XML codificado em um atributo.

Detectar essa situação e mover esse XML para um elemento aninhado (como meu chefe queria que eu fizesse) quebraria a independência das camadas. A camada superior teria que marcar o campo como "isso é formado corretamente XML", e a camada inferior, em seguida, diria "bom, vou passá-lo como um elemento aninhado".

Para mostrar que está errado, imagine que a camada inferior seja substituída por um dia para usar o JSON. Agora ele precisa ser notificado sobre os dados que estão formatados corretamente no JSON. Mas a camada superior não deve ser afetada por mudanças na implementação da camada inferior.

    
por 13.09.2014 / 23:35
fonte
-1

A conversão de XML em texto com escape está efetivamente destruindo essa marcação - achatando-a em apenas uma dimensão.

Isso é para a tag "piores práticas" - não "práticas recomendadas".

    
por 11.06.2011 / 23:27
fonte

Tags