2014-11-04 20 views
5

In seguito alle risposte fornite per la mia ultima domanda How to inject elements into character content with Closure XML? ho implementato una sottoclasse di cxml: gestore di proxy sax (caso particolare di un gestore di trasmissione). Sfortunatamente, sembra un errore nella libreria, ma tenta di produrre l'XML con definizioni di tipo di documento interno, ma il documento è un XML non valido.output non valido del gestore di trasmissione nel pacchetto XML Common Lisp Closure

Cioè, in esecuzione il parser con il comando:

(with-open-file (out #P"teste.xml" :if-exists :supersede :direction :output) 
     (let ((h (make-instance 'preproc :chained-handler (cxml:make-character-stream-sink out)))) 
    (cxml:parse #P"harem.xml" h :validate t))) 

in cui il file harem.xml inizia con (vedi il doctype):

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE colHAREM SYSTEM "harem.dtd"> 
<colHAREM versao="Segundo_dourada_com_relacoes_14Abril2010"> 
    <DOC DOCID="H2-dftre765"> 
    <p>... 

il comando produce nel teste.xml file di output:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE colHAREM SYSTEM "harem.dtd"<!ELEMENT EM #PCDATA> 
<!ATTLIST EM ID CDATA #REQUIRED> 
<!ATTLIST EM CATEG CDATA #IMPLIED> 
<!ATTLIST EM TIPO CDATA #IMPLIED> 
<!ATTLIST EM COMENT CDATA #IMPLIED> 
<!ATTLIST EM SUBTIPO CDATA #IMPLIED> 
<!ELEMENT ALT (#PCDATA|EM)*> 
<!ELEMENT OMITIDO (#PCDATA|EM|ALT|p)*> 
<!ELEMENT colHAREM (DOC)*> 
<!ATTLIST colHAREM versao CDATA #REQUIRED> 
<!ELEMENT p (#PCDATA|EM|OMITIDO|ALT)*> 
<!ATTLIST p xml:space (default|preserve) "default"> 
<!ELEMENT DOC (#PCDATA|p|OMITIDO)*> 
<!ATTLIST DOC DOCID CDATA #REQUIRED> 
> 
<colHAREM versao="Segundo_dourada_com_relacoes_14Abril2010"> 
... 

Cioè, il gestore scrive il DTD all'interno dell'output ma nel modo sbagliato, wi tutte le dichiarazioni all'interno di [ e ]. È un bug nella libreria o nel mio codice?

risposta

2

ho tracciato attraverso i passi CXML prende per il vostro esempio e prepared a patch here (il primo file, contro l'ultima CXML commesso, 991fac513dbd9b86628f99741a66d791552b1f02, si applicano con git apply 0001-....patch nella radice del CXML repository controllato). Per me sembra che il percorso del codice qui non contenga lo trigger per l'evento SAX per il sottoinsieme DTD, quindi dopo aver aggiunto che l'output ha il necessario "["/"]" aggiunto.

Potete verificare che questo funzioni per voi? Non sono nemmeno sicuro se SAX:START-INTERNAL-SUBSET sia effettivamente corretto, ma sembra fare il lavoro qui.