كيف يمكنني إنشاء XPathNavigator بأمان مقابل دفق في C#؟

StackOverflow https://stackoverflow.com/questions/255171

  •  05-07-2019
  •  | 
  •  

سؤال

بالنظر إلى دفق كمدخل ، كيف يمكنني إنشاء XPathNavigator بأمان مقابل مصدر بيانات XML؟

مصدر بيانات XML:

  • قد تحتوي على أحرف سداسية سداسية غير صالحة تحتاج إلى إزالتها.
  • قد تحتوي على أحرف لا تتطابق مع تشفير المستند المعلن.

على سبيل المثال ، سيكون لبعض مصادر بيانات XML في السحابة ترميز معلن UTF-8, ، لكن الترميز الفعلي هو Windows-1252 أو ISO 8859-1, ، والتي يمكن أن تسبب استثناء حرف غير صالح عند إنشاء XMLReader مقابل الدفق.

من StreamReader.CurrentEncoding وثائق الخصائص: "ترميز الحرف الحالي المستخدم من قِبل القارئ الحالي. يمكن أن تكون القيمة مختلفة بعد المكالمة الأولى لأي طريقة قراءة لـ StreamReader ، نظرًا لأن ترميز الكشف التلقائي لا يتم حتى يتم إجراء المكالمة الأولى إلى طريقة القراءة." يبدو أن هذا يشير إلى أنه يمكن التحقق من CurrentEncoding بعد القراءة الأولى ، ولكن هل تمسكنا بتخزين هذا الترميز عندما نحتاج إلى كتابة بيانات XML إلى دفق؟

آمل أن أجد أفضل الممارسات لإنشاء مثيل XPathNavigator/IxPathNavigable بأمان مقابل مصدر بيانات XML الذي سيتعامل برشاقة في تشفير مشكلات شخصية غير صالحة (في C# ويفضل).

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

المحلول

واجهت مشكلة مماثلة عندما تم استيراد بعض شظايا XML إلى نظام CRM باستخدام الترميز الخاطئ (لم يكن هناك ترميز مخزّن مع شظايا XML).

في حلقة قمت بإنشاء دفق غلاف باستخدام الترميز الحالي من القائمة. تم إنشاء الترميز باستخدام خيارات decoderexceptionfallback و encoderexceptionfallback (كما ذكرها @doug). إذا تم إلقاء deconderfallbacexception أثناء معالجة الدفق الأصلي ، يتم إعادة تعيين الدفق الأصلي ويتم استخدام الترميز الأكثر وضوحًا.

كانت قائمة الترميز الخاصة بنا مثل UTF-8 و Windows-1252 و GB-2312 و US-ASCII. إذا سقطت من نهاية القائمة ، فإن الدفق كان سيئًا حقًا وتم رفضه/تجاهله/إلخ.

تعديل:

قمت بتجميع عينة سريعة وملفات اختبار أساسية (المصدر هنا). لا يحتوي الكود على أي استدلال للاختيار بين صفحات التعليمات البرمجية التي تتطابق مع نفس مجموعة البايتات ، لذلك قد يتم اكتشاف ملف Windows-1252 على أنه GB2312 ، والعكس بالعكس ، اعتمادًا على محتوى الملف ، وترميز طلب التفضيل.

نصائح أخرى

من الممكن استخدام فك تشفير الفصل (وعدد قليل من الفصول ذات الصلة) للتعامل مع الشخصيات السيئة ، إما عن طريق تخطيها أو عن طريق القيام بشيء آخر (إعادة تشغيل مع ترميز جديد؟).

عند استخدام XMLTexTreader أو شيء مشابه ، سيقوم القارئ نفسه باكتشاف الترميز المعلن في ملف XML.

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