Как генерировать теги и атрибуты пространства имен с помощью data.xml 0.2.0-alpha6 для Clojurescript? - PullRequest
0 голосов
/ 08 мая 2019

Моя цель - создать элемент 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 голосов
/ 08 мая 2019

Посмотрите здесь: 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

...