كيفية تحليل XML باستخدام cxml وstp الذي يحتوي على علامة الضم

StackOverflow https://stackoverflow.com//questions/12678106

  •  12-12-2019
  •  | 
  •  

سؤال

أريد تحليل كود 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:TEXT واحد فقط مع DATA "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