因为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);
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 >
<! 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 >
<! 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);
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());
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);
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 >
<! 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.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 >
<! 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();
}
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=""