使用JAXB读写xml
1.注解
在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示
@XmlRootElement
作用:将一个Java类映射为一段XML的根节点参数:
name 定义这个根节点的名称
namespace 定义这个根节点命名空间
@XmlAccessorType
作用:定义映射这个类中的何种类型需要映射到XML。
可接收四个参数,分别是:
XmlAccessType.FIELD:表示将这个类中的 非静态(static)、非序列化(transient)属性映射到xml,有无get/set方法均可
XmlAccessType.PROPERTY:使用 set/get 方法来序列化属性或者元素(get方法可不需注解自动映射)——说明:通过get方法映射到xml,get方法上是否添加注解都可,但是不能在属性上添加注解
XmlAccessType.PUBLIC_MEMBER:将这个类中的所有public的field(字段)或property(get/set对)同时映射到XML(默认注解),该注解包含了XmlAccessType.FIELD和XmlAccessType.PROPERTY两个注解,所以注意不要对同一个字段添加两次注解
XmlAccessType.NONE:不映射
补充说明:
@XmlAccessorType的默认访问级别是 XmlAccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public权限的 getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成 xml时会报同一个属性在java类里存在两次的错误。
同理,如果@XmlAccessorType的访问权限为XmlAccessType.NONE, 如果在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。
@XmlElements
// 表示或的关系,list集合中内容可以为以下两种类型
@XmlElements({
@XmlElement(name = "Person", type = Person.class),
@XmlElement(name = "String", type = String.class)
})
private List list;
补充说明:如果List使用泛型,则List集合中只能含有一种数据类型,此时使用该注解无用。
@XmlElement
作用:指定一个字段或get/set方法映射到XML的节点。如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一个没有get/set方法的字段上标注此注解,即可将该字段映射到XML。
参数:
defaultValue 指定节点默认值
name 指定节点名称
namespace 指定节点命名空间
type 定义该字段或属性的关联类型
required 是否必须(默认为false)
nillable 该字段是否包含 nillable="true" 属性(默认为false)
@XmlAttribute
作用:指定一个字段或get/set方法映射到XML的属性(区别@XmlElement——节点)。
参数:
Name 指定属性名称
namespace 指定属性命名空间
required 是否必须(默认为false)
@XmlTransient
作用:定义某一字段或属性不需要被映射为XML。
如,当一个类的XmlAccessorType 被标注为PROPERTY时,在某一get/set方法的字段上标注此注解,那么该属性则不会被映射。
@XmlType
作用:定义映射的一些相关规则
参数:
propOrder 指定映射XML时的节点顺序
factoryClass 指定UnMarshal时生成映射类实例所需的工厂类,默认为这个类本身
factoryMethod 指定工厂类的工厂方法
name 定义XML Schema中type的名称
namespace 指定Schema中的命名空间
@XmlElementWrapper
作用:为数组元素或集合元素定义一个父节点。
如,类中有一元素为List items,若不加此注解,该元素将被映射为
<items>...</items>
<items>...</items>
这种形式,此注解可将这个元素进行包装,如:
@XmlElementWrapper(name="items")
@XmlElement(name="item")
public List items;
将会生成这样的XML样式:
<items>
<item>...</item>
<item>...</item>
</items>
@XmlJavaTypeAdapter
作用:自定义某一字段或属性映射到XML的适配器。
如,类中包含一个接口,我们可以定义一个适配器(继承自 javax.xml.bind.annotation.adapters.XmlAdapter类),指定这个接口如何映射到XML。
@XmlSchema
作用:配置整个包的namespace,这个注解需放在package-info.java文件中
2.代码实例
2.1 Object转为xml
public static void marshallerByJaxb(String path, Object object) {
try {
JAXBContext jc = JAXBContext.newInstance(object.getClass());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 编码格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 是否格式化生成的xml串
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);// 是否省略xml头声明信息
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
marshaller.marshal(object, file);
} catch (JAXBException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2.2 xml转为Object
public static void unmarshallerByJaxb(String path, Object object) {
try {
JAXBContext jc = JAXBContext.newInstance(object.getClass());
Unmarshaller unmarshaller = jc.createUnmarshaller();
File file = new File(path);
if (!file.exists()) {
throw new FileNotFoundException("Can not load xml file!");
}
unmarshaller.unmarshal(file);
} catch (JAXBException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
说明:传参时传入的obj必须为具体类型。
如:先实例化Person per = new Person();
再传unmarshallerByJaxb(path, person);
不可以直接unmarshallerByJaxb(path, Person.class);
3. List、Map集合类型说明
集合必须封装在对象内部才能使用jaxb转为xml,不能直接将集合直接转为xml
3.1 List
List集合或数组只要封装到对象内部,使用@XMLElementWrapper注解
说明:当对象内部只有一个List集合的属性时,可以不加@XMLElementWrapper注解增加一层节点,直接将List结合内的对象作为根节点下的二级节点即可。
3.2 Map
如:Map<String, Person>集合,Person为自定义的一个对象
1.创建一个新对象(如:AllPerson)作为中转对象,该对象内含有两个属性,分别是String和Person类型的(前者为Map的key,后者为Map的value);
2.使用@XMLJavaTypeAdapter注解将Map<String, Person>转为AllPerson[],数组的大小与Map的大小相同;
总结:XmlAdapter中的两个方法各有用处,注意不要漏掉
Object->xml时
Map<String, Person>—转为—> AllPerson[](AllPerson对象中包含String, Person)
Xml->Object时
AllPerson[](AllPerson对象中包含String, Person)—转为—> Map<String, Person>
使用JAXB读写xml的更多相关文章
- JAXB读写xml
一.注解 在Java模型中的创建与 xml 文件对应的节点和属性需要用注解来表示 @XmlRootElement 作用:将一个Java类映射为一段XML的根节点参数: name 定义这个根节点 ...
- C#读写xml文件的常用方法
已知有一个XML文件(bookshop.xml)如下: <?xml version="1.0" encoding="gb2312" ?> <b ...
- PHP读写XML文件的四种方法
PHP对XML文件进行读写操作的方法一共有四种,分别是:字符串方式直接读写.DOMDocument读写. XMLWrite写和XMLReader读.SimpleXML读写,本文将依次对这四种方法进行介 ...
- 在.net中序列化读写xml方法的总结
在.net中序列化读写xml方法的总结 阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命 ...
- Linux Shell脚本读写XML文件
在Linux下如何用Shell脚本读写XML?现有一个config.xml <?xml version="1.0" encoding="UTF-8"?&g ...
- ADO.NET 快速入门(六):读写 XML
ADO.NET 和 DataSet 可以读写 XML Schema 和 XML.获取更多信息,请参考 How do I...Use XML and the DataSet? DataSet 的 S ...
- C#_在.net中序列化读写xml方法的总结
阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数 ...
- Java 读写XML文件 API--org.dom4j
om4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,同时它也是一个开放源代码的软件 ...
- Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
随机推荐
- 跨平台sdk接入总结
sdk说明: 1.Bugly SDK:自动捕获上报App的脚本错误和原生代码引发的崩溃信息,并提供异常问题分类分析. 2.语音 SDK:提供游戏内收发语音功能. 接入步骤: step1:仔细通读一遍s ...
- redis缓存在项目中的使用
关于redis为什么能作为缓存这个问题我们就不说了,直接来说一下redis缓存到底如何在项目中使用吧: 1.redis缓存如何在项目中配置? 1.1redis缓存单机版和集群版配置?(redis的客户 ...
- C#或ASP.NET绘图初探
C#或ASP.NET的简单绘图 public void ProcessRequest (HttpContext context) { context.Response.ContentType = &q ...
- HDU 4313树形DP
Matrix Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU3231拓扑排序
Box Relations Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 查看自己电脑外网IP
连着wifi,在CMD窗口中显示的无线局域网适配器IP很有可能是内网IP.此时可以通过下面方法查看自己的电脑外网IP. 1.前提条件可以上外网: 2.上外网百度,输入IP,进行搜索. 3.查看结果即可 ...
- lombok 配置使用以及优势
maven依赖 <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> ...
- c# “XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
症状描述如下: 如果将一个委托作为函数指针从托管代码封送到非托管代码,并且在对该委托进行垃圾回收后对该函数指针发出了一个回调,则将激活 callbackOnCollectedDelegate 托管调试 ...
- 【bzoj3648】环套树+点分治+树状数组
tree 1s 128M by hzw czy神犇种了一棵树,他想知道地球的质量 给定一棵n个点的树,求树上经过点的个数≥K的路径数量ans 对于部分数据,树上某两点间会多出最多一条无向边 输入数据 ...
- 课下加分项目 MYPWD 20155335 俞昆
Mypwd 的解读与实现 20155335 linux下pwd命令的编写 实验要求: 1 .学习pwd命令 2 . 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 .实现my ...