سؤال

لدي اثنين من التطبيقات المكتوبة بلغة جافا التواصل مع بعضهم البعض باستخدام XML الرسائل عبر الشبكة.أنا باستخدام ساكس محلل في المتلقي إلى الحصول على البيانات مرة أخرى من الرسائل.واحدة من المتطلبات هو تضمين البيانات الثنائية في رسالة XML, ولكن ساكس لا يحب هذا.لا أحد يعرف كيفية القيام بذلك ؟

تحديث:حصلت على هذا العمل مع Base64 فئة من أباتشي العموم مكتبة الترميز, في حالة أي شخص آخر يحاول شيئا من هذا القبيل.

هل كانت مفيدة؟

المحلول

يمكن ترميز البيانات الثنائية باستخدام base64 ووضعها في Base64 العنصر ؛ المقال أدناه هو مثال جيد عن هذا الموضوع.

التعامل مع البيانات الثنائية في مستندات XML

نصائح أخرى

XML حتى تنوعا...

<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 هو مثل العنف - إذا لم تحل المشكلة, كنت لا تستخدم ما يكفي من ذلك.

تحرير:

راجع للشغل:Base64 + CDATA هو على الارجح أفضل حل

(EDIT2:
أيا upmods لي ، يرجى أيضا upmod الجواب الحقيقي.نحن لا نريد أي ضعف الروح أن تأتي إلى هنا و في الواقع تنفيذ الأسلوب لأنه كان أعلى مرتبة على ذلك, صحيح؟)

Base64 هو في الواقع الجواب الصحيح ولكن CDATA ليس هذا الأساس يقول:"هذا يمكن أن يكون أي شيء" ، ومع ذلك يجب أن لا يكون مجرد شيء يجب أن يكون Base64 في ترميز البيانات الثنائية.مخطط XML يعرف قاعدة 64 الثنائية البدائي نوع البيانات والتي يمكنك استخدامها في xsd.

كان لي هذه المشكلة فقط في الأسبوع الماضي.كان علي أن تسلسل ملف PDF وإرسالها داخل ملف XML إلى ملقم.

إذا كنت تستخدم .NET, يمكنك تحويل ملف ثنائي مباشرة إلى base64 سلسلة والتمسك بها داخل عنصر XML.

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

أو هناك طريقة يبنى الحق في XmlWriter الكائن.في حالتي ، كان علي أن تشمل مايكروسوفت نوع البيانات الاسم:

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();

سلسلة abc يبدو شيء يبدو مثل هذا:

<?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>

أنا عادة ترميز البيانات الثنائية مع MIME Base64 أو ترميز URL.

محاولة Base64 في ترميز/فك التشفير الخاص بك البيانات الثنائية.ننظر أيضا إلى CDATA أقسام

ربما ترميز لهم في مجموعة معروفة - شيء مثل قاعدة 64 هو خيار شعبي.

أي الثنائية إلى ترميز النص سوف تفعل خدعة.يمكنني استخدام شيء مثل هذا

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

في حين إجابات أخرى هي في الغالب بخير ، قد تتمكن من محاولة أخرى أكثر فعالة من حيث المساحة, طريقة ترميز مثل yEnc.(yEnc ويكيبيديا الرابط) مع yEnc أيضا الحصول على اختباري القدرات الحق "للخروج من مربع".قراءة و الروابط أدناه.بالطبع لأن XML لا أصلي yEnc اكتب مخطط XML يجب أن يتم تحديث بشكل صحيح لوصف المشفرة عقدة.

لماذا:بسبب ترميز استراتيجيات base64/63, uuencode et al.ترميزات زيادة كمية البيانات (النفقات العامة) تحتاج إلى تخزين ونقل بنحو 40% (مقابلyEnc هو 1-2%).اعتمادا على ما كنت ترميز 40% من النفقات العامة يمكن أن يكون/تصبح قضية.


yEnc - ويكيبيديا مجردة: https://en.wikipedia.org/wiki/YEnc yEnc هو الثنائية إلى ترميز النص مخطط لنقل الملفات الثنائية في الرسائل على الأعضاء أو عبر البريد الإلكتروني....ميزة إضافية من yEnc السابقة أساليب الترميز مثل uuencode و Base64, هو إدراج اتفاقية حقوق الطفل الاختباري للتحقق من أن فك الملف تم تسليمها سليمة.

Base64 النفقات العامة بنسبة 33%.

BaseXML بالنسبة XML1.0 النفقات العامة هي فقط 20%.لكنه ليس المعيار الوحيد لديهم C التنفيذ حتى الآن.التحقق من ذلك إذا كنت تشعر بالقلق مع حجم البيانات.علما بأن المتصفحات ومع ذلك يميل إلى تطبيق ضغط بحيث يكون أقل من الحاجة.

أنا وضعت عليه بعد المناقشة في هذا الموضوع: ترميز البيانات الثنائية داخل XML :بدائل base64.

يمكنك أيضا Uuencode كنت الأصلي البيانات الثنائية.هذا الشكل هو أكبر قليلا ولكنه لا يفعل نفس الشيء base63 الترميز.

إذا كان لديك السيطرة على تنسيق XML ، يجب أن تتحول المشكلة من الداخل إلى الخارج.بدلا من ربط ثنائي XML يجب أن نفكر في كيفية إرفاق مستند الذي يحتوي على أجزاء متعددة واحد منها يحتوي على XML.

الحل التقليدي إلى هذا الأرشيف (مثلا ، القطران).ولكن إذا كنت تريد أن تبقى الخاص بك أرفق وثيقة في النص على أساس الشكل أو إذا لم يكن لديك الوصول إلى الملفات أرشفة مكتبة, كما يوجد نظام موحد يستخدم بكثافة في البريد الإلكتروني HTTP وهو multipart/* MIME مع محتوى-نقل-ترميز:الثنائية.

على سبيل المثال إذا كانت الملقمات الخاصة بك من التواصل عن طريق HTTP و كنت ترغب في إرسال متعددة الوثيقة الأولية يجري مستند XML الذي يشير إلى البيانات الثنائية HTTP الاتصالات قد تبدو شيئا مثل هذا:

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--

كما في المثال أعلاه, XML الرجوع إلى البيانات الثنائية في أرفق متعددة باستخدام cid أوري المخطط الذي هو معرف المحتوى-رأس الهوية.النفقات العامة من هذا المخطط سيكون على رأس MIME.خطة مماثلة يمكن أن تستخدم أيضا استجابة HTTP.بالطبع في بروتوكول HTTP ، لديك أيضا خيار إرسال رسالة متعددة الأجزاء وثيقة منفصلة في طلب/الاستجابة.

إذا كنت ترغب في تجنب التفاف البيانات الخاصة بك في multipart هو استخدام البيانات URI:

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

ولكن هذا قد base64 النفقات العامة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top