Tenho dois aplicativos escritos em Java que se comunicam por meio de mensagens XML na rede. Estou usando um analisador SAX na extremidade receptora para obter os dados de volta das mensagens. Um dos requisitos é incorporar dados binários em uma mensagem XML, mas SAX não gosta disso. Alguém sabe como fazer isso?
ATUALIZAÇÃO: eu consegui trabalhar com a classe Base64 da biblioteca de codecs apache commons , caso alguém esteja tentando algo semelhante.
fonte
Base64 é realmente a resposta certa, mas CDATA não é, que é basicamente dizendo: "isso poderia ser qualquer coisa", no entanto, deve não ser apenas coisa, ele tem que ser Base64 codificado dados binários. O esquema XML define o binário Base 64 como um tipo de dados primitivo que você pode usar em seu xsd.
fonte
xs:base64Binary
tipo de dados, que é o tipo certo a ser usado.Tive esse problema na semana passada. Tive que serializar um arquivo PDF e enviá-lo, dentro de um arquivo XML, para um servidor.
Se você estiver usando .NET, poderá converter um arquivo binário diretamente em uma string base64 e colocá-lo dentro de um elemento XML.
Ou existe um método embutido no objeto XmlWriter. No meu caso particular, tive que incluir o namespace de tipo de dados da Microsoft:
A string abc se parece com isto:
fonte
Normalmente codifico os dados binários com MIME Base64 ou codificação de URL .
fonte
Experimente a codificação / decodificação Base64 de seus dados binários. Veja também as seções CDATA
fonte
Talvez codifique-os em um conjunto conhecido - algo como base 64 é uma escolha popular.
fonte
Qualquer codificação binário para texto resolverá o problema. Eu uso algo assim
fonte
A sobrecarga de Base64 é de 33%.
A sobrecarga de BaseXML para XML1.0 é de apenas 20% . Mas não é um padrão e só tem uma implementação em C ainda. Verifique se você está preocupado com o tamanho dos dados. Observe que, no entanto, os navegadores tendem a implementar a compactação para que seja menos necessária.
Eu o desenvolvi após a discussão neste tópico: Codificando dados binários em XML: alternativas para base64 .
fonte
Embora as outras respostas sejam geralmente boas, você pode tentar outro método de codificação mais eficiente em termos de espaço, como yEnc. ( link da wikipedia do yEnc ) Com o yEnc, você também obtém o recurso de soma de verificação "pronto para uso". Leia os links abaixo. Obviamente, como o XML não tem um tipo yEnc nativo, seu esquema XML deve ser atualizado para descrever adequadamente o nó codificado.
Por quê : Devido às estratégias de codificação base64 / 63, uuencode et al. as codificações aumentam a quantidade de dados (sobrecarga) que você precisa armazenar e transferir em cerca de 40% (contra 1-2% do yEnc). Dependendo do que você está codificando, a sobrecarga de 40% pode ser / se tornar um problema.
yEnc - resumo da Wikipedia: https://en.wikipedia.org/wiki/YEnc yEnc é um esquema de codificação binário para texto para transferir arquivos binários em mensagens na Usenet ou via e-mail. ... Uma vantagem adicional do yEnc sobre os métodos de codificação anteriores, como uuencode e Base64, é a inclusão de uma soma de verificação CRC para verificar se o arquivo decodificado foi entregue intacto.
fonte
Você também pode UUencode você dados binários originais. Este formato é um pouco mais antigo, mas faz a mesma coisa que a codificação base63.
fonte
Se você tem controle sobre o formato XML, deve virar o problema do avesso. Em vez de anexar o XML binário, você deve pensar em como incluir um documento que possui várias partes, uma das quais contém XML.
A solução tradicional para isso é um arquivo (por exemplo, tar). Mas se você deseja manter o seu documento anexo em um formato baseado em texto ou se você não tem acesso a uma biblioteca de arquivamento de arquivos, há também um esquema padronizado que é muito usado em e-mail e HTTP que é multipart / * MIME com Codificação de transferência de conteúdo: binário .
Por exemplo, se seus servidores se comunicam por meio de HTTP e você deseja enviar um documento multipartes, sendo o principal um documento XML que se refere a dados binários, a comunicação HTTP pode ter a seguinte aparência:
Como no exemplo acima, o XML se refere aos dados binários na multiparte envolvente usando um
cid
esquema de URI que é um identificador para o cabeçalho Content-Id. A sobrecarga desse esquema seria apenas o cabeçalho MIME. Um esquema semelhante também pode ser usado para resposta HTTP. Obviamente, no protocolo HTTP, você também tem a opção de enviar um documento multiparte em solicitação / resposta separada.Se você deseja evitar agrupar seus dados em uma multiparte, use o URI de dados:
Mas isso tem a sobrecarga de base64.
fonte