2024 Clojure 状态调查! 中分享您的想法。

欢迎!请查看 关于 页面了解该工作原理的更多信息。

0
data.xml
重标记

使用 aggregate-xmlns 与较大的 xml 树会导致以下异常

Execution error (ExceptionInfo) at clojure.data.xml.name/legal-xmlns-binding! (name.cljc:151).
The xmlns binding for prefix `xml` is fixed to `http://www.w3.org/XML/1998/namespace`

aggregate-xmlns 使用 gen-prefix 为每个标签创建一个新的前缀

     (binding [*gen-prefix-counter* 0]
       (-> (fn [tm uri]
             (pu/assoc! tm (gen-prefix) uri))
           qname-uri-xf
           (reduce-tree (pu/transient pu/EMPTY) xml)
           pu/persistent!))}))

gen-prefix 本身只是确定性地将字符拼接起来以创建一个新的前缀字符串,例如 "a"、"b"、"c" ...

不幸的是,第 7771 次迭代生成了前缀字符串 "xml",这在法律上是禁止使用的,并由于 clojure.data.xml.pu-map/assoc! 中的 (name/legal-xmlns-binding! prefix uri) 检查而被拒绝,导致以上引用的异常。同样的问题将在以后的时间发生在 "xmlns" 上。

一个简单的解决方案是不检查 uri 是否为空。

附录

快速复现方式如下

    (xml/aggregate-xmlns (xml/element* :coll {} (repeatedly #(xml/element :el))))

1 个答案

0
by
...