因为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=""
本文分享了使用Dom4j创建SVG文件的经验,探讨了不同节点创建与添加方法导致的名称空间问题,并提供了可行的解决方案。
8294

被折叠的 条评论
为什么被折叠?



