2014-11-04 3 views
5

Nach den Antworten für meine letzte Frage How to inject elements into character content with Closure XML? Ich implementiert eine Unterklasse von CXML: Sax-Proxy-Handler (ein besonderer Fall eines Broadcast-Handler). Leider sieht, wie ein Fehler in der Bibliothek, aber es versuchen, die XML mit internen Dokumenttypdefinitionen zu erzeugen, aber der Doc ist ein nicht gültiges XML.nicht gültige Ausgabe von Broadcast-Handler in Common Lisp Closure XML-Paket

Das heißt, läuft der Parser mit dem Befehl:

(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))) 

, wo die Datei harem.xml mit beginnt (siehe 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>... 

der Befehl erzeugt in der teste.xml Ausgabedatei:

<?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"> 
... 

Das ist, der Handler schreibt die DTD in der Ausgabe, aber in der falschen Weise, wi thout die Erklärungen innerhalb der [ und ]. Ist es ein Fehler in der Bibliothek oder in meinem Code?

Antwort

2

verfolgen ich durch die Schritte CXML für Ihr Beispiel nimmt und prepared a patch here (die erste Datei, gegen die letzte CXML begehen, 991fac513dbd9b86628f99741a66d791552b1f02, mit git apply 0001-....patch in der Wurzel des CXML Repository ausgecheckt gelten). Für mich sieht es aus wie der Codepfad hier einfach nicht Trigger das SAX-Ereignis für die DTD-Teilmenge, so nach dem Hinzufügen, dass der Ausgang hat die notwendigen "["/"]" hinzugefügt.

Können Sie bitte bestätigen, dass dies für Sie? Ich bin auch nicht sicher, ob SAX:START-INTERNAL-SUBSET tatsächlich richtig ist, aber es scheint hier die Arbeit zu tun.