如何为Clojurescript发出带有data.xml 0.2.0-alpha6的命名空间标签和属性?

时间:2019-05-08 17:38:10

标签: clojurescript

我的目的是发出带有命名空间标签和属性的xml元素。

我已经尝试为该问题构建一些虚拟的名称空间。像xmlns.foo。但这并没有解决。下面的简单示例显示了一个测试用例。

(ns app.main
  (:require [clojure.data.xml :as xml]))

(xml/emit-str
 (xml/element
  :foo:bar
  {:foo:name "foo" :foo:type "foo-type"}
  "baz"))

应该是

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<foo:bar foo:name=\"foo\" foo:type=\"foo-type\">baz</foo:bar>" 

遗憾的是实际输出是 NamespaceError:试图以与名称空间dom.cljs:32:63

不正确的方式创建或更改对象
    cljs$core$IFn$_invoke$arity$3 dom.cljs:32
    clojure$data$xml$js$dom$element_node dom.cljs:105
    cljs$core$IFn$_invoke$arity$variadic xml.cljs:45
    clojure$data$xml$emit_str xml.cljs:40
    <anonymous> main.cljs:7 ```

1 个答案:

答案 0 :(得分:0)

看这里:https://github.com/clojure/data.xml#namespace-support


只需使用纯xml进行尝试。在deps.edn中进行配置:

       org.clojure/data.xml   {:mvn/version "0.2.0-alpha6"}

普通XML起作用。声明名称空间:

(ns demo.core
  (:require
    [clojure.data.xml :as xml] ...))

(let [tags (xml/element :foo {:foo-attr "foo value"}
             (xml/element :bar {:bar-attr "bar value"}
               (xml/element :baz {} "The baz value")))]
  (t/spyx (xml/emit-str tags)) )

结果:

(xml/emit-str tags) => 
"<foo foo-attr=\"foo value\">
  <bar bar-attr=\"bar value\">
    <baz>The baz value</baz></bar></foo>"

命名空间似乎对于ClojureScript仍在进行中。此方法失败:

   (xml/alias-uri 'xh "http://www.w3.org/1999/xhtml")
   (xml/emit-str {:tag     ::xh/html
                  :content [{:tag ::xh/head}
                            {:tag ::xh/body :content ["DOCUMENT"]}]}))

但是此方法有效:

   (xml/emit-str {:tag   "{http://www.w3.org/1999/xhtml}html"   ; `::xh/html` fails
                  :content [{:tag "{http://www.w3.org/1999/xhtml}head" }
                            {:tag "{http://www.w3.org/1999/xhtml}body" :content ["DOCUMENT"]}]}))

结果:

 "<html xmlns=\"http://www.w3.org/1999/xhtml\">
    <head></head>
    <body>DOCUMENT</body></html>"

因此,它不会像a这样声明别名,而不会像 a:head

也许您应该在项目上提出问题:https://github.com/clojure/data.xml