XmlDocument и медленная обработка схемы
-
05-07-2019 - |
Вопрос
У меня есть документ 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");