سؤال

لدي مستند قالب XML وأحتاج إلى تحميله في XmlDocument.على سبيل المثال

myXMLDocument.Load(myXMLFile);

ولكن هذا بطيء جدًا حيث يتم تحميله في ملف dtd.لقد حاولت على حد سواء "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" ونسخة محلية من dtd.كلاهما يستغرق نفس الوقت تقريبًا.إذا قمت بتشغيل تحميل dtd عن طريق تعيين المحلل على قيمة خالية (على سبيل المثال)، فسأحصل على أخطاء مثل "Reference to undeclared entity 'nbsp'" إذا كانت الوثيقة تحتوي على هذه.

أحتاج إلى استخدام XmlDocument لأنني أحتاج إلى التعامل مع DOM قبل إخراج المستند.كيف يمكنني الالتفاف حول هذه المشاكل؟

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

المحلول

ويمكنك تجنب DTD إذا كنت إرجاع تيار ذاكرة فارغة:

private class DummyResolver : XmlResolver
{
   public override System.Net.ICredentials Credentials
   {
    set
    {
     // Do nothing.
    }
   }

public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
   {
    return new System.IO.MemoryStream();
   }
}

نصائح أخرى

والجواب ChrisW لتبدو مثيرة للاهتمام، ولكن أنا نفذت محلل التخزين المؤقت من هذا الرابط: http://msdn.microsoft.com/en-us/library/bb669135.aspx

وهذا زيادة سرعة من جميع أنحاء 11.5s إلى 160ms، والتي ربما تكون جيدة بما فيه الكفاية حتى الآن. إذا ما زال لا سريع بما فيه الكفاية وسوف impliment حل ChrisW ل. :)

ونظرة على ملف DTD، وهناك بعض الإشارات أكثر على الانترنت ل.mod الملفات، ربما تكون هذه بطء عملية أسفل. يمكنك أيضا محاولة لتعليق بعض منها، وتتميز بعض منهم ولكن ليس كل شيء كما "مطلوب" في هذه التعليقات.

إنه بطيء لأنه يتم تنزيله من الشبكة.لإصلاح ذلك، قم بما يلي:

  • قم بتنزيل ملفات *.mod و*.ent المشار إليها بواسطة DTD (سيخبرك مثيل XmlResolver الخاص بك بأسماء URIs التي يتم البحث عنها)
  • أضف هذه الملفات إلى مشروعك كملفات موارد
  • حدد فئة فرعية من XmlResolver، حيث تقوم طريقة GetEntity() الخاصة بها بإرجاع دفق تم إنشاؤه من ملف المورد المحلي

هل حاولت خلق محلل وهمية والتي ترجع لاغية لأي مسار اليومي وتمرير ذلك إلى الأمر الحمل؟ شيء من هذا القبيل:

class DummyResolver : XmlUrlResolver 
{
    public override Uri ResolveUri (Uri baseUri, String relativeUri) 
    {
       return null;
    }
}

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.XmlResolver = new DummyResolver();

xmlDocument.Load(@"whatever.xml");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top