문제

나는 구문 분석하여 다음과 같은 XML 코드:

(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 엔터티 및 적용을 일부 사용자 정의된 규칙들.지만,그것은 수로의 제품을 파서 구현됩니다.나는 아직 찾을 수 없습니다.

한 색소폰의 변형을 파서 나는 다음과 같은 방법:

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

I.e.나는 수집 텍스트에서 sax:characters 및 프로세스 sax:end-element.STP 에서 당신은 아마,멀리 얻을 수 있습니다 더 쉽게로 연결하여 주변 text 요소입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top