Как загрузить файл 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 2

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