JDOM实现XML读写

话说

各位读者盆友,晚上好!前面《自己实现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方法类似。

好,晚安!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值