Domanda

In un domanda precedente ho detto un po 'di lavoro con un terzo DLL di partito la cui interfaccia utilizza una serie di input XML che sono definite utilizzando DTD. Tutto è andato liscio fino ad ora, ma ho ancora questo problema fastidioso con risolvere la dichiarazione del tipo di documento nei valori di input generati.

Quello che non riesco a capire è ciò che il fattore decisivo è nel determinare dove cercare il file DTD di riferimento. Se ho una dichiarazione che assomiglia a questo:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

Il mio pensiero iniziale era che l'attuale percorso di esecuzione dell'applicazione è dove un parser apparirebbe per la DTD. Tuttavia, quando si tenta di utilizzare un in ASP.Net, l'errore che ottengo mi sconcerta ...

  

Impossibile trovare il file 'C: \ Program Files \ Microsoft Visual   Studio   9.0 \ Common7 \ IDE \ ElementName.dtd '

Perché è alla ricerca per la DTD lì?

Ci sono guru XML là fuori che mi può aiutare su questo. Io davvero non ho alcun controllo sul XML restituito da questa DLL così che cosa dovrei fare. C'è un modo per "registrare" un DTD con il sistema operativo? Come il GAC?

È stato utile?

Soluzione

Purtroppo la libreria che ha generato l'XML utilizzato un URL relativo per la DTD piuttosto che uno completo. Come tale XmlDocument del XmlControl utilizza un XmlResolver classe per convertire il percorso relativo ad uno completo. Di default utilizza un XmlUrlResolver (che è un XmlResolver calcestruzzo). Questo cercherà di mappare la posizione del DTD per una posizione che pensa è relativo al documento XML. Il problema è, dove è la XmlDocument? Probabilmente in memoria che non è relativo al nulla e il XmlUrlResolver sta usando la posizione di processo invece che nel tuo caso è Visual Studio che è situato in 'C: \ Programmi \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ devenv.exe'.

Che cosa si può fare? Beh, io si supponga di avere qui crea si possiede XmlResolver che eredita da un XmlUrlResolver l'override del metodo ResolveUri e fa qualcosa di appropriato. Dopo aver fatto questo si dovrà:

  1. Creare una classe XmlReaderSettings e impostare la proprietà XmlReolver alla classe appena creata.
  2. Crea un XmlReader utilizzando XmlReader.Create () che passa nel documento e le XmlSettings oggetto.
  3. Crea un XmlDocument e chiamare carico che passa nel XmlReader ed infine.
  4. Impostare la proprietà XmlDocument del vostro XmlControl al XmlDocument.

Francamente questo è tutto un po 'di dolore, quindi se in cui mi vorrei solo usare String.Replace per rimuovere la dichiarazione DTD dal documento prima di elaborarlo in XML.

Se ti senti davvero coraggioso è possibile creare un sistema di risoluzione che eredita direttamente da XmlResolver. Una volta che avete fatto che è possibile ignorare la GetEntity metodo e quindi è possibile ottenere il documento DTD da dove si vuole. Ho scritto una volta che ha ottenuto i DTD dal file incorporati come file di risorse, ma purtroppo, non ho il codice più: - (

Altri suggerimenti

Se non lo fai in realtà preoccupate per convalidare ogni documento contro la sua DTD, è possibile impostare la proprietà XmlResolver per nulla sul vostro XmlTextReader (o XmlDocument) di ignorare il DTD del tutto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top