为什么clojure.data.xml不会往返我的svg文件?

时间:2012-12-29 21:03:18

标签: xml clojure svg

这是一个文件 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))

1 个答案:

答案 0 :(得分:3)

你想要的是:

(clojure.data.xml/parse-str xml-picture :namespace-aware false)

这样,解析器就会将命名空间标记视为另一个属性。否则它将不会在解析的树中包含xmlns标记。