Vra

Ek het twee programme geskryf in Java wat kan kommunikeer met mekaar deur middel van XML boodskappe oor die netwerk. Ek gebruik 'n SAX parser aan die ontvangkant van die data terug uit die boodskappe kry. Een van die vereistes is om binêre data in te sluit in 'n XML-boodskap, maar SAX beteken dit nie hou nie. Is daar iemand weet hoe om dit te doen?

UPDATE: Ek het hierdie werk met die base64 klas van die apache Commons codec biblioteek , in geval iemand anders probeer iets soortgelyks.

Was dit nuttig?

Oplossing

Jy kan die binêre data enkodeer met behulp van base64 en sit dit in 'n Base64 element; die onderstaande artikel is 'n goeie een oor die onderwerp.

Hantering binêre data in XML dokumente

Ander wenke

XML is so veelsydig ...

<DATA>
  <BINARY>
    <BIT index="0">0</BIT>
    <BIT index="1">0</BIT>
    <BIT index="2">1</BIT>
    ...
    <BIT index="n">1</BIT>
  </BINARY>
</DATA>

XML is soos geweld -. As dit jou probleem oplos nie, is jy nie genoeg van dit met behulp van

EDIT:

BTW: Base64 + CDATA is waarskynlik die beste oplossing

(EDIT2:
Elkeen upmods my asseblief ook upmod die werklike antwoord. Ons wil nie enige swak siel om hier te kom en werklik uit te voer my metode, want dit is die hoogste posisie op SO, reg?)

Base64 is inderdaad die regte antwoord, maar CDATA is nie, dit is basies sê: "Dit kan enigiets wees", maar dit moet nie wees net iets, dit moet Base64 gekodeerde binêre data. XML Skema omskryf Base 64 binêre as 'n primitiewe data type wat jy kan gebruik in jou XSD.

Ek het hierdie probleem net verlede week. Ek moes 'n PDF-lêer afleveringen en stuur dit, binne 'n XML-lêer, aan 'n bediener.

As jy NET, jy kan 'n binêre lêer direk te skakel na 'n base64 string en plak dit in 'n XML-element.

string base64 = Convert.ToBase64String(File.ReadAllBytes(fileName));

Of is daar 'n metode gebou reg in die XmlWriter voorwerp. In my geval het ek na Microsoft se data type naamruimte sluit in:

StringBuilder sb = new StringBuilder();
System.Xml.XmlWriter xw = XmlWriter.Create(sb);
xw.WriteStartElement("doc");
xw.WriteStartElement("serialized_binary");
xw.WriteAttributeString("types", "dt", "urn:schemas-microsoft-com:datatypes", "bin.base64");
byte[] b = File.ReadAllBytes(fileName);
xw.WriteBase64(b, 0, b.Length);
xw.WriteEndElement();
xw.WriteEndElement();
string abc = sb.ToString();

Die string ABC lyk iets wat lyk soos volg:

<?xml version="1.0" encoding="utf-16"?>
<doc>
    <serialized_binary types:dt="bin.base64" xmlns:types="urn:schemas-microsoft-com:datatypes">
        JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbw...(plus lots more)
    </serialized_binary>
</doc>

Ek gewoonlik enkodeer die binêre data met MIME Base64 of URL enkodering .

Probeer base64 / dekodering jou binêre data. Ook kyk na CDATA artikels

Miskien enkodeer hulle in 'n bekende stel -. So iets basis 64 is 'n gewilde keuse

binêre-tot-teks enkodering die truuk doen. Ek so iets te gebruik

<data encoding="yEnc>
<![CDATA[ encoded binary data ]]>
</data>

Terwyl die ander antwoorde is meestal goed, kan jy 'n ander probeer, meer ruimte-doeltreffende, enkodering metode soos yEnc. ( yEnc wikipedia skakel ) Met yEnc ook checksum vermoë reg "uit die boks". Lees en skakels hieronder. Natuurlik, omdat XML het nie 'n boorling yEnc tik jou XML-skedule moet opgedateer word om die gekodeerde node behoorlik beskryf.

Hoekom : As gevolg van die kodering strategieë base64 / 63, uuencode et al. enkoderings verhoging van die bedrag van data (oorhoofse) wat jy nodig het om te stoor en oordra deur ongeveer 40% (teen yEnc se 1-2%). Afhangende van wat jy enkodeer, 40% oorhoofse kon wees / 'n probleem geword het.


yEnc - Wikipedia opsomming: https://en.wikipedia.org/wiki/YEnc yEnc is 'n binêre-tot-teks skema kodering vir die oordrag van binêre lêers in boodskappe op Usenet of via e-pos. ... 'n Bykomende voordeel van yEnc oor vorige enkodering metodes, soos uuencode en Base64, is die insluiting van 'n CRC checksum om te bevestig dat die ontsyfer lêer ongeskonde afgelewer.

Base64 oorhoofse is 33%.

BaseXML vir XML1.0 oorhoofse is slegs 20% . Maar dit is nie 'n standaard en het net 'n implementering C nog. Check dit uit as jy bekommerd is met grootte data is. Let daarop dat egter blaaier geneig om kompressie implementeer sodat dit minder nodig is.

Ek ontwikkel dit na die bespreking in hierdie draad: Encodeer binêre data binne XML: alternatiewe vir base64

.

Jy kan ook Uuencode jy oorspronklike binêre data. Hierdie formaat is 'n bietjie ouer, maar dit nie dieselfde ding as base63 enkodering.

As jy beheer oor die XML-formaat het, jy moet die probleem binne na buite te draai. Eerder as om die bevestiging van die binêre XML jy moet dink oor hoe om 'n dokument wat verskeie dele het, waarvan een bevat XML sluit.

Die tradisionele oplossing hiervoor is 'n argief (bv teer). Maar as jy wil om jou omringende dokument in 'n teks-gebaseerde formaat of as jy nie toegang tot 'n lêer geberg biblioteek hou, daar is ook 'n gestandaardiseerde stelsel wat swaar gebruik in e-pos en HTTP wat multipart / * MIME met Content-Transfer-Encoding: binêre .

Byvoorbeeld, as jou bedieners te kommunikeer deur middel van HTTP en jy wil 'n multi-dokument stuur, die primêre om 'n XML-dokument wat verwys na 'n binêre data, kan die HTTP kommunikasie so lyk:

POST / HTTP/1.1
Content-Type: multipart/related; boundary="qd43hdi34udh34id344"
... other headers elided ...

--qd43hdi34udh34id344
Content-Type: application/xml

<myxml>
    <data href="cid:data.bin"/>
</myxml>
--qd43hdi34udh34id344
Content-Id: <data.bin>
Content-type: application/octet-stream
Content-Transfer-Encoding: binary

... binary data ...
--qd43hdi34udh34id344--

As in bogenoemde voorbeeld, die XML verwys na die binêre data in die omringende multipart deur gebruik te maak van 'n cid URI skema wat 'n identifiseerder vir die inhoud-ID kop. Die oorhoofse van hierdie skema sal net die MIME kop wees. 'N Soortgelyke skema kan ook gebruik word vir HTTP reaksie. Natuurlik in HTTP-protokol, jy het ook die opsie van die stuur van 'n multi-dokument in afsonderlike versoek / reaksie.

As jy wil om te verhoed dat die wikkel jou data in 'n multi is om data URI gebruik:

<myxml>
    <data href="data:application/something;charset=utf-8;base64,dGVzdGRhdGE="/>
</myxml>

Maar dit het die base64 oorhoofse.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top