Pregunta

En una pregunta anterior he mencionado algunos trabajos con una tercera parte cuya DLL de interfaz utiliza una serie de entradas XML que se definen utilizando DTD. Todo ha ido bien hasta ahora, pero todavía tengo este problema acuciante con la resolución de la Declaración de tipo de documento en los valores de entrada generados.

Lo que no puedo entender es por lo que el factor decisivo es la hora de determinar dónde buscar el archivo DTD referenciada. Si tengo una declaración que tiene este aspecto:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

Mi pensamiento inicial fue que ruta de ejecución actual de la aplicación es un programa de análisis, donde buscaría la DTD. Sin embargo, cuando intento utilizar un en ASP.Net, el error que consigo me desconcierta ...

  

No se pudo encontrar el archivo 'C: \ Archivos de programa \ Microsoft Visual   Estudio   9,0 \ Common7 \ IDE \ ElementName.dtd '

¿Por qué se busca el DTD allí?

¿Hay gurús XML por ahí que me puede ayudar en este caso. Realmente no tengo ningún control sobre el código XML que se devuelve desde esta DLL así que lo que se supone que tengo que hacer. ¿Hay una manera de "registrar" un DTD con el sistema operativo? Al igual que el GAC?

¿Fue útil?

Solución

Por desgracia, la biblioteca que genera el XML utiliza una dirección URL relativa para la DTD en lugar de uno completo. Como tal XmlDocument del XmlControl está utilizando un href="http://msdn.microsoft.com/en-us/library/system.xml.xmlresolver.aspx" rel="nofollow noreferrer"> XmlResolver clase XmlUrlResolver (que es una XmlResolver hormigón). Esto va a tratar de un mapa de la ubicación de la DTD a un lugar que piensa es en relación con el documento XML. El problema es, ¿dónde está el XmlDocument? Probablemente en la memoria que no es en relación con cualquier cosa y el XmlUrlResolver está usando la ubicación proceso de cambio que en su caso es Visual Studio que se encuentra en 'C: \ Archivos de programa \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ devenv.exe'.

Entonces, ¿qué se puede hacer? Bueno, yo supongo que tienes que es el propietario del cajón XmlResolver que hereda de una XmlUrlResolver reemplaza el método ResolveUri y hace algo apropiado. Una vez hecho esto, tendrá que:

  1. Crea una clase XmlReaderSettings y establezca la propiedad XmlReolver a la clase que acaba de crear.
  2. Crear una XmlReader usando XmlReader.Create () que pasa en el documento y se oponen los XmlSettings.
  3. Crear un XmlDocument y llame de carga que pasa en el XmlReader y finalmente.
  4. Establecer la propiedad XmlDocument de su XmlControl a la XmlDocument.

Francamente eso es todo un poco de dolor, por lo que si donde yo me acaba de utilizar String.Replace para eliminar la declaración DTD del documento antes de procesarlo en XML.

Si se siente muy valiente puede crear un dispositivo de resolución que hereda directamente de XmlResolver. Una vez que haya hecho eso puede invalidar el GetEntity método y entonces se puede obtener el documento DTD desde donde quieras. Me escribió una vez que consiguió dtds de archivos incrustados como archivos de recursos, pero, por desgracia, no tengo el código de los otros: - (

Otros consejos

Si no lo hace realmente se preocupan por la validación de cada uno y todos los documentos en contra de su DTD, se puede establecer la propiedad XmlResolver a nula en su XMLTextReader (o XmlDocument) para ignorar la DTD por completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top