Question

Dans un question précédente je l'ai mentionné un peu de travail avec une DLL 3ème partie dont l'interface utilise une série d'entrées XML qui sont définis à l'aide DTD. Tout est bien passé jusqu'à présent, mais je dois encore cette question lancinante à résoudre la déclaration de type de document dans les valeurs d'entrée générées.

Ce que je ne peux pas comprendre ce que le facteur décisif est de déterminer où chercher le fichier DTD référencé. Si j'ai une déclaration qui ressemble à ceci:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

Ma pensée initiale était que le chemin d'exécution en cours de l'application est un analyseur du rechercherait le DTD. Cependant, lorsque je tente d'utiliser un ASP.Net, l'erreur que je reçois me déconcerte ...

  

fichier Impossible de trouver « c: \ Program Files \ Microsoft Visual   Studio   9.0 \ Common7 \ IDE \ ElementName.dtd '

Pourquoi est-il à la recherche de la DTD il?

Y a-t-il des gourous de XML là-bas qui peuvent me aider sur celui-ci. Je n'ai pas de contrôle sur le XML qui est retourné de cette DLL afin que suis-je censé faire. Est-il un moyen de « enregistrer » une DTD avec le système d'exploitation? Comme le GAC?

Était-ce utile?

La solution

Malheureusement, la bibliothèque qui a généré le fichier XML utilisé une URL relative pour la dtd plutôt qu'un complet. En tant que tel le XmlDocument du XmlControl utilise un XmlResolver classe pour convertir le trajet par rapport à un complet. Par défaut, il utilise un XmlUrlResolver (qui est un XmlResolver en béton). Cela va essayer de cartographier l'emplacement du dtd à un endroit qu'il pense par rapport au document Xml. Le problème est, où est le XmlDocument? Probablement dans la mémoire qui n'est pas par rapport à quoi que ce soit et le XmlUrlResolver utilise l'emplacement de processus au lieu que dans votre cas est Visual Studio qui est situé à 'c: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ devenv.exe.

Alors, que pouvez-vous faire? Eh bien, je suppose que vous devez caisse vous possédez XmlResolver qui hérite de XmlUrlResolver une surcharge la méthode ResolveUri et fait quelque chose d'approprié. Après avoir fait cela, vous aurez à:

  1. Créer une classe XmlReaderSettings et définissez la propriété XmlReolver à la classe que vous venez de créer.
  2. Créer un XmlReader à l'aide passant XmlReader.Create () dans votre document et l'objet XmlSettings.
  3. Créer un XmlDocument et appelez le passage de la charge dans le XmlReader et enfin.
  4. Définissez la propriété XmlDocument de votre XmlControl au XmlDocument.

Franchement, c'est tout un peu d'une douleur, donc si là où moi, je voudrais simplement utiliser String.replace pour enlever la déclaration DTD du document avant de le traiter en XML.

Si vous vous sentez que vous pouvez vraiment courageux créer un résolveur qui hérite directement de XmlResolver. Une fois que vous avez fait que vous pouvez remplacer le GetEntity méthode et vous pouvez obtenir le document de dtd où vous le souhaitez. J'ai écrit une fois qui a obtenu dtds de fichiers intégrés sous forme de fichiers de ressources, mais malheureusement, je n'ai pas le code plus: - (

Autres conseils

Si vous ne se soucient pas vraiment sur la validation de chaque document contre sa DTD, vous pouvez définir la propriété XmlResolver null sur votre XmlTextReader (ou XmlDocument) d'ignorer la DTD tout à fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top