我想解析以下XML-Code:

(cxml:parse "<BEGIN><URL>www.some.de/url?some=data&bad=stuff</URL></BEGIN>" (stp:make-builder))

这导致

 #<CXML:WELL-FORMEDNESS-VIOLATION "~A" {1003C5E163}>

因为'&'是一个XML特殊字符。但如果我用 &amp;? 相反,结果是:

(cxml:parse "<BEGIN><URL>www.some.de/url?some=data&amp;bad=stuff</URL></BEGIN>" (stp:make-builder))
=>#.(CXML-STP-IMPL::DOCUMENT
   :CHILDREN '(#.(CXML-STP:ELEMENT
                  #| :PARENT of type DOCUMENT |#
                  :CHILDREN '(#.(CXML-STP:ELEMENT
                                 #| :PARENT of type ELEMENT |#
                                 :CHILDREN '(#.(CXML-STP:TEXT
                                                #| :PARENT of type ELEMENT |#
                                                :DATA "www.some.de/url?some=data")
                                             #.(CXML-STP:TEXT
                                                #| :PARENT of type ELEMENT |#
                                                :DATA "&")
                                             #.(CXML-STP:TEXT
                                                #| :PARENT of type ELEMENT |#
                                                :DATA "bad=stuff"))
                                 :LOCAL-NAME "URL"))
                  :LOCAL-NAME "BEGIN")))

这并不完全是我所期望的,因为应该只有一个CXML-STP:带有数据的文本孩子"www.some.de/url?some=data&bad=stuff"

我怎样才能解决这个错误(?)行为?

有帮助吗?

解决方案

这种行为虽然不是很方便,但实际上也存在于许多其他XML解析器中。可能它的原因是能够解析任意XML实体并对其应用一些用户定义的规则。虽然,它可能只是解析器实现的副产品。我还不知道。

对于解析器的SAX变体,我采用了以下方法:

(defclass my-sax (sax:sax-parser-mixin)
  ((title :accessor title :initform nil)
   (tag :accessor tag :initform nil)
   (text :accessor text :initform "")))

(defmethod sax:start-element ((sax my-sax) namespace-uri local-name
                              qname attributes)
  (with-slots (tag tagcount text) sax
              (setf tag local-name
                    text "")))

(defmethod sax:characters ((sax my-sax) data)
  (with-slots (title tag text) sax
    (switch (tag :test 'string=)
      ("text"  (setf text (conatenate 'string text data)))
      ("title" (setf title data)))))

(defmethod sax:end-element ((sax my-sax) namespace-uri local-name qname)
  (with-slots (title tag text) sax
    (when (string= "text" local-name)
      ;; process (text sax)
    )))

即。我收集文本在 sax:characters 并在处理 sax:end-element.在STP中,你可能只需连接邻近的人就能更容易地离开 text 元素。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top