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
...