Ale*_*ker 5 lisp xml sax common-lisp
按照我的上一个问题提供的答案如何使用Closure XML将元素注入字符内容?我实现了cxml的子类:sax-proxy处理程序(广播处理程序的一个特例).不幸的是,它看起来像库中的一个错误,但它尝试使用内部文档类型定义生成XML,但doc是一个无效的XML.
也就是说,使用以下命令运行解析器:
(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)))
Run Code Online (Sandbox Code Playgroud)
harem.xml文件的开头位置(请参阅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>...
Run Code Online (Sandbox Code Playgroud)
该命令在teste.xml输出文件中生成:
<?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">
...
Run Code Online (Sandbox Code Playgroud)
也就是说,处理程序在输出中写入DTD但是以错误的方式写入,而没有在[和中的声明].它是库中还是我的代码中的错误?
小智 2
我跟踪了 CXML 为您的示例采取的步骤,并
在此处准备了一个补丁git apply 0001-....patch(第一个文件,针对最后一次 CXML 提交,991fac513dbd9b86628f99741a66d791552b1f02,在签出的 CXML 存储库的根目录中
应用
)。对我来说,这里的代码路径似乎不会触发 DTD 子集的 SAX 事件,因此在添加输出后,会添加必要的"["/"]"添加的内容。
您能验证一下这对您有用吗?我也不确定是否
SAX:START-INTERNAL-SUBSET真的正确,但它似乎在这里完成了工作。