XmlDocument и медленная обработка схемы - PullRequest
5 голосов
/ 08 января 2009

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

myXMLDocument.Load(myXMLFile);

Однако это очень медленно, так как загружается в dtd. Я пробовал как "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd", так и локальную копию dtd. Оба занимают более или менее одно и то же время. Если я перехожу к загрузке dtd, устанавливая преобразователь на ноль (например), я получаю ошибки, такие как "Reference to undeclared entity 'nbsp'", если документ содержит их.

Мне нужно использовать XmlDocument, так как мне нужно манипулировать DOM перед выводом документа. Как мне обойти эти проблемы?

Ответы [ 5 ]

3 голосов
/ 08 января 2009

Ответ ChrisW звучит интересно, однако я создал преобразователь кэширования по этой ссылке: http://msdn.microsoft.com/en-us/library/bb669135.aspx

Это увеличило скорость с 11,5 с до 160 мс, что на данный момент вполне достаточно. Если это все еще не достаточно быстро, я предложу решение ChrisW. :)

2 голосов
/ 13 мая 2011

Вы можете избежать 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();
   }
}
0 голосов
/ 08 января 2009

Вы пытались создать фиктивный распознаватель, который возвращает ноль для любого пути 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");
0 голосов
/ 08 января 2009

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

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

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

...