2014-11-04 7 views
5

Po udzieleniu odpowiedzi na moje ostatnie pytanie How to inject elements into character content with Closure XML? Zaimplementowałem podklasę cxml: sax-proxy handler (szczególny przypadek programu do obsługi wiadomości). Niestety, wygląda na błąd w bibliotece, ale próbuje utworzyć kod XML z wewnętrznymi definicjami typów dokumentów, ale dokument ten jest niepoprawny.Niepoprawne wyjście obsługi wiadomości w pakiecie Common Lisp Closure XML

Oznacza to, że działa parser za pomocą polecenia:

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

gdzie harem.xml pliku zaczyna się (patrz 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>... 

polecenie produkuje w teste.xml plik wyjściowy:

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

Oznacza to, że program obsługi pisze DTD wewnątrz wyjścia, ale w niewłaściwy sposób, WI w przypadku deklaracji wewnątrz [ i ]. Czy jest to błąd w bibliotece lub w moim kodzie?

Odpowiedz

2

Wywiodłem przez kroki cXML bierze za przykład i prepared a patch here (pierwszego pliku, przed ostatnią cXML popełnienia, 991fac513dbd9b86628f99741a66d791552b1f02, stosuje się git apply 0001-....patch w korzeniu wyrejestrowany cXML repozytorium). Dla mnie wygląda na to, że ścieżka kodu właśnie nie uruchamia zdarzenia SAX dla podzbioru DTD, więc po dodaniu, że wyjście ma niezbędne "["/"]" dodane.

Czy możesz sprawdzić, czy to działa? Nie jestem również pewny, czy SAX:START-INTERNAL-SUBSET jest rzeczywiście poprawny, ale wydaje się, że wykonuje on tutaj zadanie .