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

来源:互联网 发布:淘宝美工代码生成器 编辑:程序博客网 时间:2024/04/29 18:21

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

原创粉丝点击