Как загрузить файл XHTML в XElement с помощью пользовательского XmlUrlResolver? - PullRequest
2 голосов
/ 06 февраля 2010

Я пытаюсь загрузить файл 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.

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

1 Ответ

3 голосов
/ 06 февраля 2010

Ответ украден с досок Microsoft, где-то:

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

»).

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

Gepost door Microsoft op 10-5-2006 om 17:34

...