话说
各位读者盆友,晚上好!前面《自己实现SpringIOC》里面用到了JDOM读取xml,然后实现控制反转。当然也可以从后台取数据写入到xml中。这里用到的就是xml的读写技术。
目录
1.基础知识
2.案例
3.总结
难度系数:★☆☆ ☆☆
建议用时:30min
1.基础知识
XML-Extensible Markup Language 可扩展标记语言,结构相信大家都不陌生。
有什么用?跨平台,传输数据的一种方式;同时也是搭建环境的助手。
比如:pom.xml 用来管理所有依赖;spring.xml mybatis.xml springmvc.xml等等都是用来配置应用程序和网站的;省级联动也用xml来传输数据。
详细知识,请翻阅笔者有道笔记:
xml基础知识集锦
2.案例
重点是用起来。XML解析方式有四种,具体如何实现请参阅:
http://blog.youkuaiyun.com/xinyuan_java/article/details/66100196
需要时候拿来即用,不用客气奥。
这里介绍JDOM方式实现xml读写;后台取数据用已搭建好的SSM框架。
1)导包
2)接口
3)实现类
4)测试
1)导包
pom.xml加入:
<!-- 测试xml读写 -->
<dependency>
<groupId>jdom</groupId>
<artifactId>jdom</artifactId>
<version>1.0</version>
</dependency>
2)接口
//保存用户到xml中
int saveUsersToXml(List<User> userList,String fileName);
//根据xml读取用户
List<User> getUsersByXml(String fileName);
3)实现类
userMapeer.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hmc.dao.UserDao">
<sql id="column_name">userId,userName,userNick,password</sql>
<sql id="table_name">user</sql>
<select id="userList" resultMap="userMap">
SELECT
<include refid="column_name"/>
FROM
<include refid="table_name"/>
</select>
<resultMap type="com.hmc.pojo.User" id="userMap">
<id column="userId" jdbcType="VARCHAR" property="userId"/>
<result column="userName" jdbcType="VARCHAR" property="userName"/>
<result column="userNick" jdbcType="VARCHAR" property="userNick"/>
</resultMap>
</mapper>
UserServiceImpl
package com.hmc.service;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hmc.dao.UserDao;
import com.hmc.pojo.User;
/**
*
*2018年3月6日
*User:Meice
*下午4:25:23
*/
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
public UserDao userDao;
//日志对象
public Logger log = Logger.getLogger(this.getClass());
//查询用户列表
public List<User> userList() {
return userDao.userList();
}
//把用户查询出来的用户保存到 资源目录下的user.xml中
public int saveUsersToXml(List<User> userList, String fileName) {
int count = 0;
//1.创建文档对象
Document document = new Document();
//2.常见根元素
Element elementRoot = new Element("users");
document.addContent(elementRoot);
//3.穿件children元素
for(User user:userList) {
Element elementChild = new Element("user");
elementChild.setAttribute("id", user.getUserId());
elementChild.setText(user.getUserName());
//添加到根节点
elementRoot.addContent(elementChild);
count++;
}
//写文件
XMLOutputter outPut = new XMLOutputter();
try {
outPut.output(document, new FileOutputStream(fileName));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
log.info("写入了:"+count+"条数据");
return count;
}
//把上面方法写入的user.xml读取出来
public List<User> getUsersByXml(String fileName) {
//创建一个List对象
List<User> userlist = new ArrayList<User>();
//1.创建builder对象
SAXBuilder builder = new SAXBuilder();
//2.得到Document对象
try {
Document document =builder.build(new FileInputStream(fileName));
//3.得到根元素
Element elementRoot = document.getRootElement();
//4.得到子元素集合或者数组
List<Element> eleList = elementRoot.getChildren();
for(Element ele:eleList) {
User user = new User();
user.setUserId(ele.getAttributeValue("id"));
user.setUserName(ele.getText());
//添加到集合中
userlist.add(user);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
}
return userlist;
}
}
4)测试
UsetTest
package com.hmc.p2p.test;
/**
*
*2018年3月6日
*User:Meice
*下午4:18:13
*/
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.hmc.pojo.User;
import com.hmc.service.UserService;
import sun.util.logging.resources.logging;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:spring.xml","classpath:spring-db.xml"})
public class UserTest {
//引入日志
public Logger log = Logger.getLogger(this.getClass());
@Resource(name="userService")//尽量不要自动装配
public UserService userService;
/**
* 查询用户列表
*/
@Test
public void userTest() {
List<User> userList = userService.userList();
System.out.println(userList);
}
/**
* 测试 把查询出来的用户列表写入xml中
*/
@Test
public void testWriteUsersToXml() {
int a = userService.saveUsersToXml(userService.userList(), "user.xml");//默认就在项目路径下面
log.info("写入的数量为:"+a);
}
/**
* 测试 把写入user.xml中的内容读取出来
*/
@Test
public void testReadUserByUserXml() {
List<User> userList = userService.getUsersByXml("user.xml");
log.info("读取出来的user.xml内容为:"+userList);
}
/**
* 测试结果:
* [INFO ] 2018-03-11 18:06:34,214 method:com.hmc.p2p.test.UserTest.testReadUserByUserXml(UserTest.java:66)
读取出来的user.xml内容为:[User [userId=b5ccf611-66a6-4f6a-b65c-7a5e24a79d11, userName=user1, userNick=null, password=null],
User [userId=e042d140-b90a-4193-8295-6d2109fc80af, userName=user2, userNick=null, password=null],
User [userId=44391652-c40e-4951-8c09-e6cb51af7186, userName=user3, userNick=null, password=null]]
*/
}
运行结果:
项目根目录下:user.xml
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="b5ccf611-66a6-4f6a-b65c-7a5e24a79d11">user1</user>
<user id="e042d140-b90a-4193-8295-6d2109fc80af">user2</user>
<user id="44391652-c40e-4951-8c09-e6cb51af7186">user3</user>
</users>
3.总结
1)写入
1.导包jdom包
2.文本对象:Document doc = new Document();
3.创建根节点和子节点
Element eleRoot = new Element("users");
doc.addContent(eleRoot);
4.遍历添加内容,分别赋值
Element eleSon = new Element("user");
eleRoot.addContent(eleSon);
eleSon.setAttribute("id",user.getUserId());
eleSon.setText(user.getUserName());
5.写入 (流)
XMLOutputter对象 output();
由此可知:
<user id="b5ccf611-66a6-4f6a-b65c-7a5e24a79d11">user1</user>
有键值对形式的 key-value,用的方法是:setAttribute(key,value);
直接写内容:setText()
2)读取
1.创建文本对象Document SAXBuilder builder = new SAXBuilder();
2.分别得到rootElement,childrenElement对象
Element rootEle = builder.getRootElement();
List<Element> childEles = rootEle.getChildren();
3.遍历取值
getAttribute(key,value);
getText();
这个很简单,导包之后直接用就行;DOM4J方法类似。
好,晚安!

被折叠的 条评论
为什么被折叠?



