Как загрузить файл XHTML в XElement с помощью пользовательского XmlUrlResolver?
Я пытаюсь получить файл XHTML загружается в XElement с помощью LINQ. Однако у меня возникли проблемы с решателем. Проблема связана со следующим определением:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
У меня есть пользовательский XmlUrlResolver с переопределенным GetEntity, который преобразует ссылки, такие как http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd к локальному ресурсному потоку. Это прекрасно работает почти для всего XHTML DTD. Единственное, что я не могу решить, - это Uri "- //W3C / / DTD XHTML 1.0 Transitional/ / EN", и я не уверен, что мне следует с ним делать.
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
var resourceName = "ePub.DTD." + absoluteUri.Segments[absoluteUri.Segments.GetLength(0) - 1];
if (_resources.Contains(resourceName))
{
Stream dataStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
return dataStream;
}
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
Как вы видите в приведенном выше коде, все, что я не могу решить, обрабатывается по умолчанию XmlUrlResolver
. Это означает, что приведенная выше ссылка начинается с - / / W3C/. Базовый метод, однако, бросает DirectoryNotFoundException
однако. Продолжение загрузит XElement
просто отлично. Если я вместо этого возвращаю пустой поток, это вызывает ошибку, которая будет выброшена во время загрузки XHTML в XElement
.
Любые подсказки, которые кто-то может иметь о обработка такого публичного определения с помощью обычая XmlUrlResolver
?
1 ответ:
Ответ, украденный с плат Microsoft, где-то:
Такое поведение является преднамеренным. Если в объявлении DOCTYPE указаны как общий идентификатор, так и системный идентификатор, то XmlReader сначала пытается определить, является ли XmlResolver.GetEntity понимает открытый идентификатор ("- //W3C/ / DTD XHTML 1.1 / / EN"). Поэтому он вызывает GetEntity с открытым идентификатором, и если решатель не понимает его (как XmlUrlResolver), он создает исключение. XmlReader ловит исключение и вызывает GetEntity, но это время с системным идентификатором ("http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd").
Спасибо, - Хелена Котас, Система.Разработчик Xml
Gepost door Microsoft op 10-5-2006 om 17: 34