Вопрос

У меня есть документ xml-шаблона, который мне нужно загрузить в XmlDocument.например

myXMLDocument.Load(myXMLFile);

Однако это происходит очень медленно, поскольку загружается в dtd.Я пробовал и то, и другое "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" и локальная копия dtd.И то, и другое занимает более или менее одинаковое время.Если я отключу загрузку dtd, установив для преобразователя значение null (например), я получу такие ошибки, как "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,5 с до 160 мс, что на данный момент вполне достаточно. Если это все еще не достаточно быстро, я предложу решение ChrisW. :)

Посмотрите на файл DTD, есть еще несколько онлайн-ссылок на файлы .mod, возможно, они замедляют процесс. Вы также можете попробовать закомментировать некоторые из них, некоторые из них, но не все, помечены как " обязательные для заполнения " в комментариях.

Это происходит медленно, потому что загружается из сети.Чтобы исправить это, выполните следующие действия:

  • Загрузите файлы *.mod и * .ent, на которые ссылается DTD (ваш экземпляр XmlResolver сообщит вам имена URI, которые ищутся).
  • Добавьте эти файлы в свой проект в качестве файлов ресурсов
  • Определите подкласс XmlResolver, метод GetEntity() которого возвращает поток, созданный из локального файла ресурсов

Вы пытались создать фиктивный распознаватель, который возвращает ноль для любого пути dtd, и передать его в команду загрузки? Что-то вроде:

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