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);
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=""
- dom4j 子结点名字空间为 xmlns="" 解决办法
- Dom4j为XML文件要结点添加xmlns属性
- Dom4j为XML文件要结点添加xmlns属性 .
- dom4j含xmlns(命名空间)调用selectNodes为空问题
- tools:context=”.MainActivity”与xmlns:tools名字空间
- tools:context=”.MainActivity”与xmlns:tools名字空间
- dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性
- dom4j 为生成 XML 的文件添加 xmlns(命名空间) 属性
- HTML文件的DOCTYPE与名字空间(html xmlns)声明
- 带有名字空间(xmlns)的解析问题
- dom4j 新增节点 自动出现xmlns=""
- dom4j为生成XML的文件添加xmlns属性
- Dom4j解析含前缀与名字空间的XML
- 关于dom4j在解析拥有命名空间xmlns时,无法解析的问题
- xmlns:XML命名空间
- xmlns命名空间
- xmlns命名空间
- xmlns命名空间
- (转)asp.net跳转页面的三种方法比较
- 让Nokia SDK与最近版本的ActivePerl协同工作
- 关于未能加载文件或程序集 system.web.extensions解决方法
- C/C++面试题目集锦
- 如何使用shell脚本改变当前工作路径
- dom4j 子结点名字空间为 xmlns="" 解决办法
- 观"2007年中常用软件大盘点 "一文后的个人软件盘点
- 寻求帮助!
- BBS 开发
- Linux fedora 7.0的安装
- cmd net命令
- appfuse1.9.4部署指南
- Software Modeling and Design
- Part 1: Introduction to OOAD