因为SVG 本来打算用字符串拼的.但是考虑如果做缩放或者其他一些东西的时候容易出错
所以最后还是考虑用Dom4j,主页标榜他最快于是选择了他,放弃了 JDom
然后 最简单的例子

xml=DocumentHelper.createDocument();
xml.addDocType("svg", "-//W3C//DTD SVG 1.1//EN",
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd");


Namespace ns = Namespace.get("http://www.w3.org/2000/svg");

svg = xml.addElement("svg",ns.getURI());
svg.addAttribute("version", "1.1");
svg.addAttribute("width", "100%");
svg.addAttribute("heigth", "100%");
svg.add(ns);

我的简单的SVG 的基本格式就出来了.然后我的噩梦就出现了.
我打算每个函数 只是做一个局部的XML 结点出来 然后轻松的加入到整个根里面
Element a = DocumentHelper.createElement("a");
svg.add(a);
本来我想要的是
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" heigth="100%">
<a />
</svg>
给我的是
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" heigth="100%">
<a xmlns="" />
</svg>
然后就不能做SVG 解析.我的图象就不在了
最后尝试了很多办法终于解决了问题,中间发现几种方式建立结点和加入结点
1. Element a = DocumentHelper.createElement("a");
svg.add(a);

2. Element a = svg.addElement("a");
3. Element a = new DOMElement("a");
svg.add(a);

同样名字空间的加入也是2种方式
4. Namespace ns = Namespace.get("http://www.w3.org/2000/svg");
svg.add(ns);
5. Namespace ns = Namespace.get("http://www.w3.org/2000/svg");
xml.addElement("svg",ns.getRUI());
然后如果你用 1+4 的方式就是
Namespace ns = Namespace.get("http://www.w3.org/2000/svg");
svg.add(ns);
Element a = DocumentHelper.createElement("a");
svg.add(a);
然后生成
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" heigth="100%">
<a xmlns="" />
</svg>
各种方式都是这样,非常苦恼....
最后发现只有用 2+5
Namespace ns = Namespace.get("http://www.w3.org/2000/svg");
xml.addElement("svg",ns.getRUI());
Element a = svg.addElement("a");
才可以生成我要的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" heigth="100%">
<a />
</svg>
希望对大家有用,因为不同的浏览器解析的时候 对xmlns="" 的处理不一样
(标准认为是默认空间和什么不写一个样)
最后在说下我的想法,因为调用ADD 的时候 实际上是要通过一个树结构加入的所以可能会在调用ADD 的时候对没有名字空间的赋值做 xmlns="" 当作默认空间了
从源码中 (dom4j 的Namespace)

public String asXML() ...{
StringBuffer asxml = new StringBuffer(10);
String pref = getPrefix();


if ((pref != null) && (pref.length() > 0)) ...{
asxml.append("xmlns:");
asxml.append(pref);
asxml.append("="");

} else ...{
asxml.append("xmlns="");
}

asxml.append(getURI());
asxml.append(""");

return asxml.toString();
}

可以看出当一个名字空间的Prefix为空的时候 直接输出了 xmlns=""