Как загрузить файл XHTML в XElement с помощью настраиваемого XmlUrlResolver?

Я пытаюсь загрузить файл XHTML в LINQ XElement. Однако у меня возникают проблемы с резолвером. Проблема связана со следующим определением:

<!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?


person Jaapjan    schedule 05.02.2010    source источник


Ответы (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»rel= ").

Спасибо, - Елена Котас, разработчик System.Xml.

Дверь Gepost Microsoft оп 10-5-2006 в 17:34

person Jaapjan    schedule 06.02.2010
comment
В качестве альтернативы вы также можете преобразовать общедоступный идентификатор в системный идентификатор, который может показаться, и он будет работать правильно без создания каких-либо исключений во время загрузки или разрешения. - person Jaapjan; 08.02.2010