dom4j 子结点名字空间为 xmlns="" 解决办法

因为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%" >
< />
</ 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%" >
< />
</ 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="" 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值