我的目的是发出带有命名空间标签和属性的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 ```
答案 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