Function: soap-xs-parse-element

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

Signature

(soap-xs-parse-element NODE)

Documentation

Construct a soap-xs-element from NODE.

Source Code

;; Defined in /usr/src/emacs/lisp/net/soap-client.el.gz
(defun soap-xs-parse-element (node)
  "Construct a `soap-xs-element' from NODE."
  (let ((name (xml-get-attribute-or-nil node 'name))
        (id (xml-get-attribute-or-nil node 'id))
        (type (xml-get-attribute-or-nil node 'type))
        (optional? (soap-node-optional node))
        (multiple? (soap-node-multiple node))
        (ref (xml-get-attribute-or-nil node 'ref))
        (substitution-group (xml-get-attribute-or-nil node 'substitutionGroup))
        (node-name (soap-l2wk (xml-node-name node))))
    (cl-assert (memq node-name '(xsd:element xsd:group))
               "expecting xsd:element or xsd:group, got %s" node-name)

    (when type
      (setq type (soap-l2fq type 'tns)))

    (when ref
      (setq ref (soap-l2fq ref 'tns)))

    (when substitution-group
      (setq substitution-group (soap-l2fq substitution-group 'tns)))

    (unless (or ref type)
      ;; no type specified and this is not a reference.  Must be a type
      ;; defined within this node.
      (let ((simple-type (soap-xml-get-children1 node 'xsd:simpleType)))
        (if simple-type
            (setq type (soap-xs-parse-simple-type (car simple-type)))
          ;; else
          (let ((complex-type (soap-xml-get-children1 node 'xsd:complexType)))
            (if complex-type
                (setq type (soap-xs-parse-complex-type (car complex-type)))
              ;; else
              (error "soap-xs-parse-element: Missing type or ref"))))))

    (make-soap-xs-element :name name
                          ;; Use the full namespace name for now, we will
                          ;; convert it to a nstag in
                          ;; `soap-resolve-references-for-xs-element'
                          :namespace-tag soap-target-xmlns
                          :id id :type^ type
                          :optional? optional? :multiple? multiple?
                          :reference ref
                          :substitution-group substitution-group
                          :is-group (eq node-name 'xsd:group))))