2010-02-05 2 views
2

Я пытаюсь получить файл XHTML, загруженный в LINQ XElement. Тем не менее, у меня возникают проблемы с преобразователем. Проблема связана со следующим определением:Как загрузить XHTML-файл в XElement с помощью пользовательского XmlUrlResolver?

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

ответ

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 цит 10-5- 2006 om 17:34

+0

В качестве альтернативы вы также можете разрешить публичный идентификатор системного идентификатора, который будет казаться, и он будет работать правильно, не генерируя никаких исключений во время загрузки или разрешения. – Jaapjan