Back

element (clj)

(source)

variable

Examples

acmeism/RosettaCodeData
(require '[clojure.data.xml :as xml])

(def xml-example (xml/element :root {} (xml/element :element {} "Some text here")))
nasa/Common-Metadata-Repository
(ns cmr.search.services.aql.converters.spatial
  "Handles converting AQL spatial conditions into spatial search conditions"
  (:require [clojure.data.xml :as x]
            [cmr.search.services.aql.conversion :as c]
            [cmr.common.xml :as cx]
            [cmr.spatial.point :as p]
            [cmr.spatial.ring-relations :as rr]
            [cmr.spatial.mbr :as m]
            [cmr.spatial.polygon :as poly]
            [cmr.spatial.line-string :as ls]
            [cmr.search.models.query :as qm]))

(defmulti spatial-element->shape
  "Converts a aql spatial area element into a spatial shape"
  (fn [elem]
    (:tag elem)))

(defmethod spatial-element->shape :IIMSPoint
  [element]
  (let [{{^String lat :lat ^String lon :long} :attrs} element]
    (p/point (Double. lon) (Double. lat))))

(defmethod spatial-element->shape :IIMSPolygon
  [element]
  (let [points (map spatial-element->shape
                    (cx/elements-at-path element [:IIMSLRing :IIMSPoint]))]
    (poly/polygon :geodetic [(rr/ring :geodetic points)])))

(defmethod spatial-element->shape :IIMSBox
  [element]
  (let [[lower-left
         upper-right] (map spatial-element->shape
                           (cx/elements-at-path element [:IIMSPoint]))]
    (m/mbr (:lon lower-left) (:lat upper-right) (:lon upper-right) (:lat lower-left))))

(defmethod spatial-element->shape :IIMSLine
  [element]
  (ls/line-string
    :geodetic (map spatial-element->shape
                   (cx/elements-at-path element [:IIMSPoint]))))

(defmethod c/element->condition :spatial
  [concept-type element]
  ;; TOOD TwoDCoordinateSystem could be a second child of spatial
  (qm/->SpatialCondition (spatial-element->shape (first (:content element)))))
nasa/Common-Metadata-Repository
(ns cmr.common.test.xml
  (:require [clojure.test :refer :all]
            [cmr.common.xml :as cx]
            [clojure.data.xml :as x]
            [clj-time.core :as t]))

(deftest element-at-path-test
  (are [xml path] (= (when xml (x/parse-str xml))
                     (cx/element-at-path parsed-sample-xml path))
       "<alpha>45</alpha>" [:inner :alpha]
       "<bravo>ovarb</bravo>" [:inner :bravo]
       nil [:foo]
       nil [:top :foo]
       nil [:foo :bar]))

(def sample-multiple-elements-xml
  "<top>
    <inner ia=\"1\" ib=\"foo\">
      <alpha>45</alpha>
      <alpha>46</alpha>
      <bravo>ovarb</bravo>
      <bravo>ovary</bravo>
      <single>single_value</single>
      <datetime>1986-10-14T04:03:27.456Z</datetime>
      <datetime>1988-10-14T04:03:27.456Z</datetime>
      <single_datetime>1989-10-14T04:03:27.456Z</single_datetime>
    </inner>
  </top>")

(def parsed-sample-multiple-elements-xml
  (x/parse-str sample-multiple-elements-xml))

(deftest elements-at-path-test
  (are [xml path] (= (:content (x/parse-str xml))
                     (cx/elements-at-path parsed-sample-multiple-elements-xml path))
       "<a><alpha>45</alpha><alpha>46</alpha></a>" [:inner :alpha]
       "<a><bravo>ovarb</bravo><bravo>ovary</bravo></a>" [:inner :bravo]
       "<a><single>single_value</single></a>" [:inner :single]))

(deftest contents-at-path-test
  (are [expected path] (= expected (cx/contents-at-path parsed-sample-multiple-elements-xml path))
       [["45"] ["46"]] [:inner :alpha]
       [["ovarb"] ["ovary"]] [:inner :bravo]
       [["single_value"]] [:inner :single]
       [] [:foo]))

(deftest strings-at-path-test
  (are [expected path] (= expected (cx/strings-at-path parsed-sample-multiple-elements-xml path))
       ["45" "46"] [:inner :alpha]
       ["ovarb" "ovary"] [:inner :bravo]
       ["single_value"] [:inner :single]
       [] [:foo]
       [] [:inner :foo]))

(deftest datetimes-at-path-test
  (are [expected path] (= expected (cx/datetimes-at-path parsed-sample-multiple-elements-xml path))
       [(t/date-time 1986 10 14 4 3 27 456) (t/date-time 1988 10 14 4 3 27 456)] [:inner :datetime]
       [(t/date-time 1989 10 14 4 3 27 456)] [:inner :single_datetime]
       [] [:foo]
       [] [:inner :foo]))
clojure/data.xml
(ns clojure.data.xml.spec
  (:require [clojure.spec :as s]
            [#?(:cljs cljs.spec.impl.gen :clj clojure.spec.gen) :as gen]
            clojure.test.check.generators
            [clojure.data.xml :as xml]
            [clojure.data.xml.name :as name]
            [clojure.data.xml.name :as node]
            #?@(:cljs [[clojure.data.xml.js.dom :as dom]])
            [clojure.string :as str]))

#?(:cljs
   (do (s/def ::dom/Element (s/with-gen (partial instance? dom/Element)
                              #(gen/fmap dom/element-node (s/gen ::node/Element))))
       (s/def ::dom/Text (s/with-gen (partial instance? dom/Text)
                           #(gen/fmap dom/text-node (gen/string-ascii))))))