Function: soap-xs-parse-sequence

soap-xs-parse-sequence is a byte-compiled function defined in soap-client.el.gz.

Signature

(soap-xs-parse-sequence NODE)

Documentation

Parse a sequence definition from XML NODE.

Returns a soap-xs-complex-type.

Source Code

;; Defined in /usr/src/emacs/lisp/net/soap-client.el.gz
(defun soap-xs-parse-sequence (node)
  "Parse a sequence definition from XML NODE.
Returns a `soap-xs-complex-type'."
  (cl-assert (memq (soap-l2wk (xml-node-name node))
                   '(xsd:sequence xsd:choice xsd:all))
             nil
             "unexpected node: %s" (soap-l2wk (xml-node-name node)))

  (let ((type (make-soap-xs-complex-type)))

    (setf (soap-xs-complex-type-indicator type)
          (cl-ecase (soap-l2wk (xml-node-name node))
            (xsd:sequence 'sequence)
            (xsd:all 'all)
            (xsd:choice 'choice)))

    (setf (soap-xs-complex-type-optional? type) (soap-node-optional node))
    (setf (soap-xs-complex-type-multiple? type) (soap-node-multiple node))

    (dolist (r (xml-node-children node))
      (unless (stringp r)                 ; skip the white space
        (cl-case (soap-l2wk (xml-node-name r))
          ((xsd:element xsd:group)
           (push (soap-xs-parse-element r)
                 (soap-xs-complex-type-elements type)))
          ((xsd:sequence xsd:choice xsd:all)
           ;; an inline sequence, choice or all node
           (let ((choice (soap-xs-parse-sequence r)))
             (push (make-soap-xs-element :name nil :type^ choice)
                   (soap-xs-complex-type-elements type))))
          (xsd:attribute
           (push (soap-xs-parse-attribute r)
                 (soap-xs-type-attributes type)))
          (xsd:attributeGroup
           (push (soap-xs-parse-attribute-group r)
                 (soap-xs-type-attribute-groups type))))))

    (setf (soap-xs-complex-type-elements type)
          (nreverse (soap-xs-complex-type-elements type)))

    type))