LINUX.ORG.RU

Какой сейчас самый актуальный / фичастый парсер xml на CL?

 , , , ,


0

2

Всем привет. Нужно парсить xml от поставщиков и загонять в базу инет-магазина. Какой у нас щас самый нормальный парсер, который умеет лениво обрабатывать xml на условный миллиард* итемов и не падать? Для CL это plump или на что еще стоит обратить внимание? На racket / clojure тоже подойдет, если кто в курсе и имел опыт практического применения. Интересует в первую очередь практичность, незабагованность и фичастость.

На Racket пакет sxml

Только использовать лучше не по документации (там он дерево строит, а значит память жрёт), а как-то вроде

(require sxml/ssax/SSAX-code)

(define (new-level elem-gi attributes namespaces expected-content seed)
  ...)

(define (finish-element elem-gi attributes namespaces parent-seed seed)
  ...)

(define (char-data string1 string2 seed)
  ...
  (void))

(define (doctype port docname systemid internal-subset? seed)
  (values #f '() namespaces seed))

(define (undecl-root elem-gi seed)
  (values #f '() namespaces seed))

(define p (ssax:make-parser NEW-LEVEL-SEED new-level
                            FINISH-ELEMENT finish-element
                            CHAR-DATA-HANDLER char-data
                            DOCTYPE doctype
                            UNDECL-ROOT undecl-root))

(call-with-input-file "file.xml"
  (lambda (f)
    (read-char f) ; пропускаем префикс UTF
    (read-line f) ; пропускаем <?xml ... ?>
    (p f #f))))

На обработчиках событий new-level, finish-element и char-data строишь логику загрузки. Использование памяти от длины xml не зависит.

monk ★★★★★ ()

cl-json! Я им порнокартинки с чанов качаю, ещё не разу не упало у меня, всё стоит как надо

/ Слепой мимопроходил /

deadplace ()
Последнее исправление: deadplace (всего исправлений: 1)
(eval-when (:compile-toplevel :load-toplevel :execute)
  (unless (find-package :bike)
    (ql:quickload :bike)))

(defpackage #:xml-example
  (:use #:cl #:bike))

(in-package #:xml-example)

(use-namespace 'System.Xml)

(defun parse-xml-file (filename)
  (with-disposable (reader (new 'XmlTextReader filename))
    (flet ((node-type-p (node-type type)
             (bike-equals node-type (enum 'XmlNodeType type))))
      (loop :with stack = '()
            :while (invoke reader 'Read)
            :for nt = (property reader 'NodeType)
            :for name = (property reader 'Name)
            :do (cond ((node-type-p nt 'Element)
                       (push name stack)
                       (format t "Element: ~a~%" name))
                      ((node-type-p nt 'EndElement)                       
                       (let ((name (pop stack)))
                         (format t "End element: ~a~%" name)))
                      ((node-type-p nt 'Text)
                       (format t "Text: ~a~%" (property reader 'Value)))
                      #| ... |#
                      )))))

lovesan ★★ ()

Всем привет. Нужно парсить xml от поставщиков и загонять в базу инет-магазина. common lisp

Пол Грэм изобрел машину времени?

Im_not_a_robot ★★★★★ ()

Я думаю, можно брать любую реализацию, где можно в типа SAX. CXML, например.

turtle_bazon ★★★★★ ()

plump, кстати, от товарища Shinmera. Я бы его взял, потому что этому товарищу доверяю.

turtle_bazon ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.