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

2

Я пытаюсь получить файл 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. Continuing будет загружать XElement просто отлично. Если я верну пустой поток, он вызывает ошибку при загрузке XHTML в XElement.

Любые подсказки, которые могут возникнуть у кого-то, связанные с обработкой такого определения PUBLIC с пользовательским XmlUrlResolver?

Теги:
linq
dtd
xhtml
linq-to-xml

1 ответ

3
Лучший ответ

Ответ, украденный с платформ Microsoft, где-то:

Это поведение по дизайну. Когда в объявлении DOCTYPE указываются как открытый идентификатор, так и системный идентификатор, XmlReader сначала пытается, если XmlResolver.GetEntity понимает публичный идентификатор ( "-//W3C//DTD XHTML 1.1//EN" ). Таким образом, он вызывает GetEntity с открытым идентификатором, и если распознаватель не понимает его (например, XmlUrlResolver), он выдает исключение. XmlReader ловит исключение и вызывает GetEntity, но на этот раз с системным идентификатором ( " http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" ).

Спасибо, -Helena Kotas, разработчик System.Xml

Дверь Gepost Microsoft op 10-5-2006 om 17:34

  • 0
    Кроме того, вы также можете разрешить общедоступный идентификатор для идентификатора системы, который может показаться, и он будет работать правильно, не создавая каких-либо исключений во время загрузки или разрешения.
Сообщество Overcoder
Наверх
Меню