Mam dwie aplikacje napisane w Javie, które komunikują się ze sobą za pomocą komunikatów XML w sieci. Używam parsera SAX na końcu odbierającym, aby odzyskać dane z wiadomości. Jednym z wymagań jest osadzenie danych binarnych w wiadomości XML, ale SAX tego nie lubi. Czy ktoś wie, jak to zrobić?
AKTUALIZACJA: Mam to, pracując z klasą Base64 z biblioteki kodeków Apache commons , na wypadek, gdyby ktoś inny próbował czegoś podobnego.
źródło
Base64 jest rzeczywiście właściwą odpowiedzią, ale CDATA nie, to w zasadzie mówi: „to może być cokolwiek”, jednak nie może to być byle jakie, muszą to być dane binarne zakodowane w Base64. Schemat XML definiuje binarny Base 64 jako prymitywny typ danych, którego możesz użyć w swoim xsd.
źródło
xs:base64Binary
typie danych, który jest właściwy do użycia.Miałem ten problem w zeszłym tygodniu. Musiałem serializować plik PDF i wysłać go w pliku XML na serwer.
Jeśli używasz .NET, możesz przekonwertować plik binarny bezpośrednio na ciąg base64 i umieścić go w elemencie XML.
Lub istnieje metoda wbudowana bezpośrednio w obiekt XmlWriter. W moim przypadku musiałem uwzględnić przestrzeń nazw typu danych firmy Microsoft:
Ciąg abc wygląda mniej więcej tak:
źródło
Zwykle koduję dane binarne za pomocą kodowania MIME Base64 lub URL .
źródło
Spróbuj kodować / dekodować dane binarne Base64. Zajrzyj także do sekcji CDATA
źródło
Może zakoduj je do znanego zestawu - coś takiego jak baza 64 jest popularnym wyborem.
źródło
Każde kodowanie binarne na tekst załatwi sprawę. Używam czegoś takiego
źródło
Narzut Base64 wynosi 33%.
BaseXML dla XML1.0 narzut wynosi tylko 20% . Ale to nie jest standard i ma jeszcze tylko implementację C. Sprawdź to, jeśli obawiasz się rozmiaru danych. Należy jednak pamiętać, że przeglądarki mają tendencję do implementowania kompresji, więc jest ona mniej potrzebna.
Opracowałem go po dyskusji w tym wątku: Kodowanie danych binarnych w XML: alternatywy dla base64 .
źródło
Podczas gdy inne odpowiedzi są w większości w porządku, możesz wypróbować inną, bardziej wydajną przestrzennie metodę kodowania, taką jak yEnc. ( yEnc wikipedia link ) Z yEnc również można uzyskać sumę kontrolną zaraz po wyjęciu z pudełka. Przeczytaj i linki poniżej. Oczywiście, ponieważ XML nie ma natywnego typu yEnc, twój schemat XML powinien zostać zaktualizowany, aby poprawnie opisał zakodowany węzeł.
Dlaczego : Ze względu na strategie kodowania base64 / 63, uuencode et al. kodowanie zwiększa ilość danych (narzut), które musisz przechowywać i przesyłać o około 40% (w porównaniu z 1-2% YEnc). W zależności od tego, co kodujesz, 40% narzut może być / stać się problemem.
yEnc - streszczenie Wikipedii: https://en.wikipedia.org/wiki/YEnc yEnc to schemat kodowania binarnego na tekst służący do przesyłania plików binarnych w wiadomościach w Usenecie lub za pośrednictwem poczty e-mail. ... Dodatkową zaletą yEnc nad poprzednimi metodami kodowania, takimi jak uuencode i Base64, jest dołączenie sumy kontrolnej CRC w celu sprawdzenia, czy zdekodowany plik został dostarczony w stanie nienaruszonym. Wcześniejsze
źródło
Możesz także zakodować oryginalne dane binarne. Ten format jest nieco starszy, ale robi to samo, co kodowanie base63.
źródło
Jeśli masz kontrolę nad formatem XML, powinieneś odwrócić problem na drugą stronę. Zamiast dołączać binarny plik XML, powinieneś pomyśleć o tym, jak załączyć dokument, który ma wiele części, z których jedna zawiera XML.
Tradycyjnym rozwiązaniem jest archiwum (np. Tar). Ale jeśli chcesz zachować załączony dokument w formacie tekstowym lub jeśli nie masz dostępu do biblioteki archiwizującej pliki, istnieje również ustandaryzowany schemat, który jest często używany w wiadomościach e-mail i HTTP, który jest wieloczęściowy / * MIME z Content-Transfer-Encoding: binarny .
Na przykład, jeśli Twoje serwery komunikują się przez HTTP i chcesz wysłać dokument wieloczęściowy, z których podstawowym jest dokument XML, który odnosi się do danych binarnych, komunikacja HTTP może wyglądać mniej więcej tak:
Jak w powyższym przykładzie, XML odwołuje się do danych binarnych w otaczającym go wieloczęściowym przy użyciu
cid
schematu URI, który jest identyfikatorem nagłówka Content-Id. Narzut tego schematu byłby tylko nagłówkiem MIME. Podobny schemat można również zastosować do odpowiedzi HTTP. Oczywiście w protokole HTTP masz również możliwość wysłania wieloczęściowego dokumentu w osobnym żądaniu / odpowiedzi.Jeśli chcesz uniknąć zawijania danych w wieloczęściowy, użyj identyfikatora URI danych:
Ale to ma narzut na base64.
źródło