Я пытаюсь получить файл 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
?
Ответ, украденный с платформ 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