2010-02-05 6 views
2

J'essaye d'obtenir un fichier XHTML chargé dans un XElement LINQ. Cependant, je rencontre des problèmes avec le résolveur. Le problème a à voir avec la définition suivante:Comment charger un fichier XHTML dans un XElement en utilisant un XmlUrlResolver personnalisé?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

J'ai un XmlUrlResolver personnalisé avec une GetEntity surchargée qui convertit des liens tels que http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd à un flux de ressources locales. Cela fonctionne très bien pour presque toute la DTD XHTML. Le seul que je suis incapable de résoudre est le Uri "- // W3C // DTD XHTML 1.0 Transitional // FR" et je ne suis pas sûr de ce que je devrais faire avec.

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); 
    } 

Comme vous le voyez dans le code ci-dessus, tout ce que je ne peux pas résoudre est gérée par la valeur par défaut XmlUrlResolver. Cela signifie que le lien ci-dessus commence par - // W3C /. La méthode de base renvoie cependant un DirectoryNotFoundException. Continuer va charger le XElement très bien. Si je renvoie à la place un flux vide, cela provoque une erreur lors du chargement du XHTML dans le XElement.

Tout indice que quelqu'un pourrait avoir à propos de la gestion d'une telle définition PUBLIC avec un XmlUrlResolver personnalisé?

Répondre

3

Réponse volé conseils Microsoft, quelque part:

Ce comportement est par conception. Lorsque l'ID public et l'ID système sont spécifiés dans la déclaration DOCTYPE, XmlReader essaie d'abord si XmlResolver.GetEntity comprend l'identificateur public ("- // W3C // DTD XHTML 1.1 // FR"). Donc, il appelle GetEntity avec l'ID public et si le résolveur ne le comprend pas (comme le XmlUrlResolver), il lève une exception. Le XmlReader intercepte l'exception et appelle la GetEntity, mais cette fois avec l'identifiant du système (« http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd «).

Merci, -Helena Kotas, System.XML Developer

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

+0

Alternativement, vous pouvez également résoudre l'ID public à l'ID du système qu'il semblerait et il fonctionnera correctement sans générer d'exception pendant le chargement ou la résolution. – Jaapjan

Questions connexes