سؤال

في السؤال السابق لقد ذكرت بعض الأعمال مع DLL لجهة خارجية تستخدم واجهتها سلسلة من مدخلات XML التي تم تعريفها باستخدام DTDs.لقد سار كل شيء بسلاسة حتى الآن، ولكن لا يزال لدي هذه المشكلة المزعجة المتعلقة بحل إعلان نوع المستند في قيم الإدخال التي تم إنشاؤها.

ما لا يمكنني اكتشافه هو العامل الحاسم في تحديد مكان البحث عن ملف DTD المشار إليه.إذا كان لدي إعلان يبدو كالتالي:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

كان تفكيري الأولي هو أن مسار التنفيذ الحالي للتطبيق هو المكان الذي يبحث فيه المحلل اللغوي عن DTD.ومع ذلك، عندما أحاول استخدام تحكم XML في ASP.Net، الخطأ الذي يظهر لي يحيرني...

لا يمكن العثور على ملف 'C: Program Files Microsoft Visual Studio 9.0 Common7 ide elementName.dtd'

لماذا يبحث عن DTD هناك؟

هل هناك أي معلمو XML يمكنهم مساعدتي في هذا الأمر.ليس لدي حقًا أي سيطرة على ملف XML الذي تم إرجاعه من ملف DLL هذا، فماذا يفترض بي أن أفعل.هل هناك طريقة "لتسجيل" DTD في نظام التشغيل؟مثل اللجنة الاستشارية الحكومية؟

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

المحلول

لسوء الحظ، استخدمت المكتبة التي أنشأت ملف XML عنوان url نسبيًا لـ dtd بدلاً من عنوان مؤهل بالكامل.على هذا النحو، يستخدم XmlDocument الخاص بـ XmlControl ملف XmlResolver فئة لتحويل المسار النسبي إلى مسار مؤهل بالكامل.بشكل افتراضي يستخدم XmlUrlResolver (وهذا هو XmlResolver ملموس).سيحاول هذا تعيين موقع dtd إلى موقع يعتقد أنه متعلق بمستند Xml.المشكلة هي، أين هو XmlDocument؟ربما في الذاكرة التي لا علاقة لها بأي شيء ويستخدم XmlUrlResolver موقع العملية بدلاً من ذلك وهو في حالتك Visual Studio الموجود في "c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe".

ذلك ما يمكن أن تفعله؟حسنًا، أفترض أنه يتعين عليك وضع صندوق XmlResolver الخاص بك والذي يرث من XmlUrlResolver ويتجاوز طريقة ResolveUri ويفعل شيئًا مناسبًا.وبعد القيام بذلك، سيتعين عليك:

  1. قم بإنشاء فئة XmlReaderSettings وقم بتعيين خاصية XmlReolver إلى الفئة التي أنشأتها للتو.
  2. قم بإنشاء XmlReader باستخدام XmlReader.Create() وتمرير مستندك وكائن XmlSettings.
  3. قم بإنشاء XmlDocument واستدعاء Load وتمريره في XmlReader وأخيراً.
  4. قم بتعيين خاصية XmlDocument الخاصة بـ XmlControl إلى XmlDocument.

بصراحة، هذا الأمر مؤلم بعض الشيء، لذا إذا كان الأمر كذلك، فسأستخدم string.Replace لإزالة إعلان DTD من المستند قبل معالجته في XML.

إذا كنت تشعر بالشجاعة حقًا، فيمكنك إنشاء محلل يرث مباشرة من XmlResolver.بمجرد الانتهاء من ذلك، يمكنك تجاوز GetEntity الطريقة ومن ثم يمكنك الحصول على مستند dtd من أي مكان تريد.لقد كتبت مرة واحدة تحتوي على dtds من الملفات المضمنة كملفات موارد، ولكن لسوء الحظ، لم يعد لدي الكود :-(

نصائح أخرى

إذا كنت لا فعلا يهتمون التحقق من كل وثيقة ضد DTD لها، هل يمكن تعيين الخاصية XmlResolver لاغية على XmlTextReader (أو XmlDocument) تجاهل DTD تماما.

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