这是一个文件 yo.svg :
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<circle cx="50" cy="50" r="50" stroke="black" stroke-width="2" fill="red" />
</svg>
Firefox和Chrome都将其渲染为带有黑色边框的红色圆圈。 (我不知道其他浏览器做了什么)。
下面是一些clojure代码(版本1.4),它将其写入 yo.svg ,解析它,重新编码它,并将结果写入 yo2 .svg ,看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<svg width="200" height="200">
<circle cx="50" cy="50" r="50" stroke="black" stroke-width="2" fill="red"/>
</svg>
显然,clojure正在做出改变。浏览器都不会呈现 yo2.svg 。
我认为我做错了什么,但是相当多的研究让我感到困惑:
我想知道为什么clojure正在进行这些更改,以及我是否应该忽略clojure.data.xml并手动生成xml,或者使用clojure.data.xml来执行中间位并编写自己的标头。 svg甚至是一种xml吗?
这是我的clojure计划:
(require 'clojure.data.xml)
(let [ xml-picture "<svg width=\"200\" height=\"200\" xmlns=\"http://www.w3.org/2000/svg\">
<circle cx=\"50\" cy=\"50\" r=\"50\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />
</svg>"
round-trip-picture (clojure.data.xml/indent-str
(clojure.data.xml/parse-str
xml-picture))]
(spit "yo.svg" xml-picture)
(spit "yo2.svg" round-trip-picture)
(println xml-picture)
(println "------------------")
(println round-trip-picture))
答案 0 :(得分:3)
你想要的是:
(clojure.data.xml/parse-str xml-picture :namespace-aware false)
这样,解析器就会将命名空间标记视为另一个属性。否则它将不会在解析的树中包含xmlns标记。