2010-04-08 3 views
5

Ho scritto una classe che estende XmlUrlResolver per risolvere i riferimenti agli identificatori pubblici nei documenti XML. Per esempio, quando un documento XML inizia con:Come utilizzare un XmlResolver personalizzato per risolvere gli identificatori pubblici * all'interno di * un DTD?

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

L'identificatore pubblico "- // personalizzato/EN" viene passato al parametro relativeURI della mia sovrascritto ResolveUri() metodo, e ha deliberato la posizione attuale DTD sul disco. Funziona correttamente.

Il problema si verifica quando è presente un riferimento di entità all'interno della DTD stessa. Per esempio:

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

In questo caso, l'identificatore di sistema "soextblx.dtd" è passato a ResolveUri() anziché l'identificatore pubblico "- // // DTD OASIS XML Cambio tavolo Modello 19.990.315 // EN".

C'è qualche modo per realizzare questo? Anche l'override di GetEntity() sembra non funzionare, perché viene anche passato l'identificatore di sistema.

+2

Potresti aggiungere il codice nella tua classe? – Cine

risposta

1

Nell'attuale implementazione l'identificatore pubblico non viene utilizzato quando risolve un identificatore esterno. L'opzione è usare l'eccezione come catch e quindi string validare l'id pubblico (tuttavia, questa soluzione non è elegante ed è cludgy). Però, funzionerebbe ...

Naturalmente (questo richiederebbe anche che tu conosca l'ID pubblico o almeno una parte della stringa), in modo da poter usare getEntity().

Ho cercato on-line per un riferimento che identifica questo:

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

Speriamo che questo aiuta.