simple xml java_SimpleXML详细用法(转)

之前曾写过一blog : XStream序列化JAVA对象为XML以及反序列化(http://sjsky.iteye.com/blog/784434),今天介绍另一个Java BeanXML 之间序列化和反序列化的轻量级工具:Simple

特点:

jar lib文件只有360K左右的大小

它的使用不需要依赖于其他 JAR 文件

通过注解的方式,灵活方便

下面将分节详细介绍Simple的特点和使用方法:

[一]、简单bean的序列化和反序列化

[二]、自定义节点名称

[三]、嵌套对象

[四]、可选的非强制性的元素或属性

[五]、List处理

[六]、inline 参数用法

[七]、构造函数的注解处理

[一]、简单bean的序列化和反序列化

1.java bean

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import java.util.Date;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.Element;

import org.simpleframework.xml.Root;

/**

*

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root

public class MyTestVo {

@Element

private String userName;

@Attribute

private String wife;

@Attribute

private String realName;

@Element

private Date bornDate;

@Element

private Double height;

public String toString() {

return "MyTestVo : [ userName = " + userName + " , wife = " + wife

+ " , realName = " + realName + " , height = " + height

+ " , bornDate = " + bornDate + " ]";

}

//省略set get等方法

......

}

2.序列化

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

public static void main(String[] args) throws Exception {

String xmlpath = "d:/test/michael/simple_testvo.xml";

MyTestVo vo = new MyTestVo();

vo.setUserName("michael");

vo.setRealName("大大");

vo.setWife("小小");

vo.setHeight(173.3d);

vo.setBornDate(new Date());

try {

Serializer serializer = new Persister();

File result = new File(xmlpath);

serializer.write(vo, result);

} catch (Exception e) {

e.printStackTrace();

}

}

序列化成功生成的simple_testvo.xml文件如下:

Xml代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

michael

2011-09-28 17:39:59.432 CST

173.3

ps: 注解可以把Java的属性序列化时指定为属性或者节点元素

3.反序列化

把上述生成的XML文件反序列化成Java bean测试代码:

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

public static void main(String[] args) throws Exception {

String xmlpath = "d:/test/michael/simple_testvo.xml";

Serializer serializer = new Persister();

File source = new File(xmlpath);

try {

MyTestVo vo = serializer.read(MyTestVo.class, source);

System.out.println(vo);

} catch (Exception e) {

e.printStackTrace();

}

}

如果XML中包括中文字符有可能反序列化时会报错,以utf-8的编码读取XML文件即可,故修改代码如下:

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

String xmlpath = "d:/test/michael/simple_testvo.xml";

Serializer serializer = new Persister();

try {

InputStreamReader is = new InputStreamReader(new FileInputStream(

xmlpath), "utf-8");

PropertyList parseVo = serializer.read(PropertyList.class, is);

System.out.println(parseVo);

} catch (Exception e) {

e.printStackTrace();

}

}

运行反序列化,打印Java bean信息如下:

MyTestVo : [ userName = michael , wife = 小小小 , realName = 大大 , height = 173.3 , bornDate = Wed Sep 28 17:39:59 CST 2011 ]

[二]、自定义节点名称

1.java bean

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import java.util.Date;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.Element;

import org.simpleframework.xml.Root;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root(name = "MyTest")

public class MyTestVo {

@Element

private String userName;

@Attribute(name = "MyWife")

private String wife;

@Attribute

private String realName;

@Element(name = "born")

private Date bornDate;

@Element

private Double height;

@Override

public String toString() {

return "MyTestVo : [ userName = " + userName + " , wife = " + wife

+ " , realName = " + realName + " , height = " + height

+ " , bornDate = " + bornDate + " ]";

}

//set get ......

}

2.序列化

序列化后生成的simple_testvo.xml文件如下:

Xml代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

michael

2011-09-28 21:47:37.455 CST

173.3

可以和之前的序列化XML文件对比下,看看区别在哪里。

3.反序列化

运行反序列化程序后的打印结果如下:

MyTestVo : [ userName = michael , wife = 小小 , realName = 大大 , height = 173.3 , bornDate = Wed Sep 28 21:47:37 CST 2011 ]

[三]、嵌套对象

1.java bean

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.Element;

import org.simpleframework.xml.Root;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root

public class ConfigurationVo {

@Element

private ServerVo server;

@Attribute

private int id;

public ServerVo getServer() {

return server;

}

public int getId() {

return id;

}

public void setServer(ServerVo pServer) {

server = pServer;

}

public void setId(int pId) {

id = pId;

}

}

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.Element;

import org.simpleframework.xml.Root;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root

public class ServerVo {

@Attribute

private int port;

@Element

private String host;

@Element

private SecurityVo security;

public int getPort() {

return port;

}

public String getHost() {

return host;

}

public SecurityVo getSecurity() {

return security;

}

public void setPort(int pPort) {

port = pPort;

}

public void setHost(String pHost) {

host = pHost;

}

public void setSecurity(SecurityVo pSecurity) {

security = pSecurity;

}

}

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.Element;

import org.simpleframework.xml.Root;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root

public class SecurityVo {

@Attribute

private boolean ssl;

@Element

private String keyStore;

public boolean isSsl() {

return ssl;

}

public String getKeyStore() {

return keyStore;

}

public void setSsl(boolean pSsl) {

ssl = pSsl;

}

public void setKeyStore(String pKeyStore) {

keyStore = pKeyStore;

}

}

2.序列化

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

String xmlpath = "d:/test/michael/simple_testvo.xml";

SecurityVo security = new SecurityVo();

security.setSsl(true);

security.setKeyStore("Michael");

ServerVo server = new ServerVo();

server.setHost("sjsky.iteye.com");

server.setPort(8088);

server.setSecurity(security);

ConfigurationVo config = new ConfigurationVo();

config.setId(10000);

config.setServer(server);

Serializer serializer = new Persister();

try {

File xmlFile = new File(xmlpath);

serializer.write(config, xmlFile);

} catch (Exception e) {

e.printStackTrace();

}

}

运行上述方法,序列化生成的XML文件如下:

Xml代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

sjsky.iteye.com

Michael

3.反序列化的方法和之前的一致,自己 可以 测试下结果是否正确。

[四]、可选的非强制性的元素或属性

1.java bean

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import java.util.Date;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.Element;

import org.simpleframework.xml.Root;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root

public class MyTestVo {

@Element

private String userName;

// 不是每个人都有妻子的 吼吼

@Attribute(required = false)

private String wife;

@Attribute

private String realName;

// 不想泄露年龄噢

@Element(required = false)

private Date bornDate;

@Element

private Double height;

@Override

public String toString() {

return "MyTestVo : [ userName = " + userName + " , wife = " + wife

+ " , realName = " + realName + " , height = " + height

+ " , bornDate = " + bornDate + " ]";

}

//省略setter getter方法

}

2.序列化

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

String xmlpath = "d:/test/michael/simple_testvo.xml";

MyTestVo vo = new MyTestVo();

vo.setUserName("michael");

vo.setRealName("大大");

vo.setHeight(173.3d);

Serializer serializer = new Persister();

try {

File xmlFile = new File(xmlpath);

serializer.write(vo, xmlFile);

} catch (Exception e) {

e.printStackTrace();

}

运行序列化程序后生成的XML文件如下:

Xml代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

michael

173.3

3.反序列化

运行反序列化程序后打印结果如下:

MyTestVo : [ userName = michael , wife = null , realName = 大大 , height = 173.3 , bornDate = null ]

[五]、List处理

1.java bean

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import java.io.FileInputStream;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.ElementList;

import org.simpleframework.xml.Root;

import org.simpleframework.xml.Serializer;

import org.simpleframework.xml.core.Persister;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root

public class PropertyList {

@ElementList

private List list;

@Attribute

private String name;

public List getList() {

return list;

}

public String getName() {

return name;

}

public void setList(List pList) {

list = pList;

}

public void setName(String pName) {

name = pName;

}

@Override

public String toString() {

return "PropertyList : [ name = " + name + " , EntryVo list size = "

+ list.size() + " ] .";

}

}

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.Element;

import org.simpleframework.xml.Root;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root

public class EntryVo {

@Attribute

private String name;

@Element

private String value;

public String getName() {

return name;

}

public String getValue() {

return value;

}

public void setName(String pName) {

name = pName;

}

public void setValue(String pValue) {

value = pValue;

}

}

2.序列化

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

/**

* @param args

* @throws Exception

*/

public static void main(String[] args) throws Exception {

String xmlpath = "d:/test/michael/simple_testvo.xml";

Serializer serializer = new Persister();

try {

PropertyList vo = initBean();

serializer.write(vo, new File(xmlpath));

} catch (Exception e) {

e.printStackTrace();

}

}

private static PropertyList initBean() {

PropertyList vo = new PropertyList();

vo.setName("Wife List");

List subList = new ArrayList();

EntryVo subvo = new EntryVo();

subvo.setName("A");

subvo.setValue("福晋");

subList.add(subvo);

subvo = new EntryVo();

subvo.setName("B");

subvo.setValue("侧福晋");

subList.add(subvo);

subvo = new EntryVo();

subvo.setName("C");

subvo.setValue("小三");

subList.add(subvo);

subvo = new EntryVo();

subvo.setName("D");

subvo.setValue("二奶");

subList.add(subvo);

vo.setList(subList);

return vo;

}

运行序列化程序后生成的XML文件如下:

Xml代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

福晋

侧福晋

小三

二奶

3.反序列化,运行结果打印对象信息如下:

PropertyList : [ name = Wife List , EntryVo list size = 4 ] .

4.修改注解@ElementList的参数

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

@ElementList(name = "WifeList", entry = "wife")

private List list;

序列化后生成的XML文件如下:

Xml代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

福晋

侧福晋

小三

二奶

注意XML文件的变化。

[六]、 inline 参数用法

1.java bean

以上节中得bean为基础修改注解如下:

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

@Root

public class PropertyList {

@ElementList(name = "WifeList", entry = "wife", inline = true)

private List list;

@Attribute

private String name;

public List getList() {

return list;

}

public String getName() {

return name;

}

public void setList(List pList) {

list = pList;

}

public void setName(String pName) {

name = pName;

}

@Override

public String toString() {

return "PropertyList : [ name = " + name + " , EntryVo list size = "

+ list.size() + " ] .";

}

}

2.序列化后生成的XML文件如下:

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

福晋

侧福晋

小三

二奶

和上节生成的文件相比,XML结构少了一个层次。

[七]、构造函数的注解处理

1.java bean

Java代码  3fde6ead3502a76fb29a9dc09d5fa70d.png

package michael.serialization.simplexml;

import org.simpleframework.xml.Attribute;

import org.simpleframework.xml.Element;

import org.simpleframework.xml.Root;

import org.simpleframework.xml.Serializer;

import org.simpleframework.xml.core.Persister;

/**

* @blog http://sjsky.iteye.com

* @author Michael

*/

@Root

public class EntryVo {

public EntryVo(@Attribute(name = "name")

String name, @Element(name = "value")

String value) {

this.name = name;

this.value = value;

}

@Attribute(name = "name")

private String name;

@Element(name = "value")

private String value;

public String getName() {

return name;

}

public String getValue() {

return value;

}

public void setName(String pName) {

name = pName;

}

public void setValue(String pValue) {

value = pValue;

}

@Override

public String toString() {

return "EntryVo : [ name = " + name + ", value = " + value + " ].";

}

}

2.序列化

生成的XML文件如下:

http://sjsky.iteye.com

3.反序列化

反序列化生成的bean的信息打印如下:

EntryVo : [ name = blog, value = http://sjsky.iteye.com ].

ps:如果java bean有参数的构函数,需要在构造函数的参数前也加上相应的注解,否则在反序列化时会出错。

本文就先介绍到这,下次再介绍其他运用事例。

本文连接:http://sjsky.iteye.com/blog/1182057

转载请注明来自:Michael's blog @ http://sjsky.iteye.com

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值