2010-04-08 23 views
5

J'ai écrit une classe qui étend XmlUrlResolver pour résoudre les références aux identifiants publics dans les documents XML. Par exemple, lorsqu'un document XML commence par:Comment utiliser un XmlResolver personnalisé pour résoudre les identificateurs publics * dans * une DTD?

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE chapter PUBLIC "-//Custom//EN" "custom.dtd"> 

L'identifiant public « - // personnalisée/FR » est transmis au paramètre relativeURI de ma overriden méthode ResolveUri(), et résolu à l'emplacement de DTD réelle sur le disque. Cela fonctionne correctement.

Le problème se produit lorsqu'il existe une référence d'entité dans la DTD elle-même. Par exemple:

<!ENTITY % tablemodel 
    PUBLIC "-//OASIS//DTD XML Exchange Table Model 19990315//EN" 
    "soextblx.dtd"> 

Dans ce cas, l'identifiant du système "soextblx.dtd" est passé à ResolveUri() au lieu de l'identifiant public "- // // DTD XML OASIS échange de table modèle 19990315 // EN".

Y a-t-il un moyen d'accomplir cela? Surcharger GetEntity() ne semble pas fonctionner, car il est également passé l'identifiant du système.

+2

Pourriez-vous ajouter le code dans votre cours? – Cine

Répondre

1

Dans la mise en œuvre actuelle, l'identificateur public n'est pas utilisé lorsque résout un identificateur externe. Votre option est d'utiliser l'exception comme une capture puis une chaîne valide l'identifiant public (cependant, cette solution n'est pas élégante et est cludgy). Bien que, cela fonctionnerait ....

Bien sûr (ceci exigerait également que vous connaissiez l'id public ou au moins une partie de la chaîne), de sorte que vous puissiez employer le getEntity().

J'ai cherché en ligne pour une référence qui identifie ceci:

http://bytes.com/topic/net/answers/172597-xmlresolver-parameter-entity-problem

Espérons que cela aide.