JAXB玩转命名空间
2014-05-07 06:18
330 查看
声明:如果你正在发愁xml命名空间及其前缀问题,那么请继续,否则请跳过
本文讲解使用jaxb结合dom4j的XMLFilterImpl过滤器实现序列化和反序列化的完全控制
主要实现以下功能
序列化及反序列化时忽略命名空间
序列化时使用@XmlRootElement(namespace="http://www.lzrabbit.cn")注解作为类的默认命名空间,彻底消除命名空间前缀
序列化时引用类有不同命名空间时也不会生成命名空间前缀,而是在具体的xml节点上添加相应的xmlns声明
其它的xml节点命名及命名空间需求
同一个包下有多个命名空间
自定义命名空间前缀
依赖的jar dom4j
主要原理就是在序列化和反序列化时通过XMLFilterImpl的匿名实现类实现命名空间及xml节点名称的控制,实现多样化需求,废话不多说直接上代码,有更多个性化需求的看官请自行扩展
View Code
调用
输出结果:
可以看到输出的xml完全达到我们的预期
实现细节都在代码里面了,很简单,当遇到有特殊需求的xml命名空间问题时,再也不用愁了
本文讲解使用jaxb结合dom4j的XMLFilterImpl过滤器实现序列化和反序列化的完全控制
主要实现以下功能
序列化及反序列化时忽略命名空间
序列化时使用@XmlRootElement(namespace="http://www.lzrabbit.cn")注解作为类的默认命名空间,彻底消除命名空间前缀
序列化时引用类有不同命名空间时也不会生成命名空间前缀,而是在具体的xml节点上添加相应的xmlns声明
其它的xml节点命名及命名空间需求
同一个包下有多个命名空间
自定义命名空间前缀
依赖的jar dom4j
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>
主要原理就是在序列化和反序列化时通过XMLFilterImpl的匿名实现类实现命名空间及xml节点名称的控制,实现多样化需求,废话不多说直接上代码,有更多个性化需求的看官请自行扩展
import javax.xml.bind.annotation.*; @XmlRootElement(namespace="http://www.lzrabbit.cn/") @XmlAccessorType(XmlAccessType.FIELD) public class ClassA { private int classAId; @XmlElement(name="ClassAName") private String classAName; @XmlElement(namespace="http://www.cnblogs.com/") private ClassB classB; public int getClassAId() { return classAId; } public void setClassAId(int classAId) { this.classAId = classAId; } public String getClassAName() { return classAName; } public void setClassAName(String classAName) { this.classAName = classAName; } public ClassB getClassB() { return classB; } public void setClassB(ClassB classB) { this.classB = classB; } } import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class ClassB { private int ClassBId; private String ClassBName; public int getClassBId() { return ClassBId; } public void setClassBId(int classBId) { this.ClassBId = classBId; } public String getClassBName() { return ClassBName; } public void setClassBName(String classBName) { this.ClassBName = classBName; } }
View Code
调用
import cn.lzrabbit.util.XmlUtil; public class MainRun { /** * @param args */ public static void main(String[] args) { ClassB classB = new ClassB(); classB.setClassBId(22); classB.setClassBName("B2"); ClassA classA = new ClassA(); classA.setClassAId(11); classA.setClassAName("A1"); classA.setClassB(classB); System.out.println(XmlUtil.toXML(classA)); } }
输出结果:
<?xml version="1.0" encoding="UTF-8"?> <classA xmlns="http://www.lzrabbit.cn/"> <classAId>11</classAId> <ClassAName>A1</ClassAName> <classB xmlns="http://www.cnblogs.com/"> <ClassBId>22</ClassBId> <ClassBName>B2</ClassBName> </classB> </classA>
可以看到输出的xml完全达到我们的预期
实现细节都在代码里面了,很简单,当遇到有特殊需求的xml命名空间问题时,再也不用愁了
相关文章推荐
- .NET:不显示窗口的应用程序框架
- 哈佛大学:探索地外文明的先行者
- Numerical Analysis---Hermite Interpolation
- 条形码扫描枪数据读取的问题
- 「cocos2d-x」瓦片地图学习(1)(2)
- 虚拟机网卡桥接到无线网卡上 无法上网解决方法
- memcached命令
- lunux命令笔记
- SQL SERVER: 给用户增加执行存储过程的权限
- linux配置服务器笔记
- DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)
- Java7版本: switch语句支持String、Enum类型(JDK1.5)与原来byte、short、char和int.
- shell学习笔记___1
- 5_Shell语言―――文本处理命令之wc、tr、cut、join、sort和uniq
- 【LeetCode OJ】Triangle
- 来玩Play框架04 表单
- cocos2d+TexturePackerGUI动画制作
- LAMP架构之NFS
- 使用 GIT 获得Linux Kernel的代码并查看,追踪历史记录
- python file.tell() 在windows下需要注意的地方