聪聪工作室---XML---从txt文件中读取内容存到XML文件中

文章转自:https://www.jianshu.com/p/b6ee0d5b463d

 

在实现这个程序中遇到一些编码问题,从txt文件中得到的数据放入xml文件的过程中报错

后来解决了,是转码问题,在eclipse中的build path中把编码格式转成utf-8输出


思路:

分析info.txt文件中的数据,构建一个构造函数类

Regionn.java 代码

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class Regionn {

    @XmlAttribute(name = "id")
    private String id;

    @XmlElement(name = "name")
    private String name;

    @XmlElement(name = "boss")
    private String boss;

    @XmlElement(name = "avgIncome")
    private String avgIncome;

    @XmlElement(name = "superRegion")
    private String superRegion;

    public Regionn() {

    }

    public Regionn(String id) {
        this();
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getBoss() {
        return boss;
    }

    public void setBoss(String boss) {
        this.boss = boss;
    }

    public String getAvgIncome() {
        return avgIncome;
    }

    public void setAvgIncome(String avgIncome) {
        this.avgIncome = avgIncome;
    }

    public String getSuperRegion() {
        return superRegion;
    }

    public void setSuperRegion(String superRegion) {
        this.superRegion = superRegion;
    }

    @Override
    public String toString() {
        return "Region [id=" + id + ", name=" + name + ", boss=" + boss + ", avgIncome=" + avgIncome + ", superRegion="
                + superRegion + "]";
    }

}

代码截图:


 
Regionn01.png
 
Regionn02.png

思路:

思路的第一点是把txt中的文件读取出来,并把它存放到一个集合中

具体实现:

RegionInfoParser.java 代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class RegionInfoParser {

    public static List<Regionn> parseRegions(String filename) {

        // List<Region> �Ƿ���ֵ���� ��String filename)�Ǵ���IJ���
        BufferedReader br = null;// ��ʼ��Ϊ��
        List<Regionn> results = new ArrayList<Regionn>();
        // <Regionn>�Ƿ���
        // ����һ��ArrayList ����

        try {
            br = new BufferedReader(new FileReader(filename));// ���ļ�
            String line = null;// ��ʼ��line

            while ((line = br.readLine()) != null) {
                // ����ȡ������Ϣ��Ϊ��ʱ
                line = line.trim();// ȥ�����ߵĿո�

                if (line.startsWith("#")) {
                    continue;// �����#��ͷ�ģ��������

                }

                String[] patterns = line.split(",");
                // �Ѷ��������л��Զ��Ž��зָ���ַ�浽������

                String id = patterns[0];// ����pattern�����±�Ϊ0���ַ�Ϊid
                String name = patterns[1];
                String avgIncome = patterns[2];
                String superRegion = patterns[3];
                String boss = (patterns.length == 5) ? patterns[4] : "";// 判断
                                                                        // 如果patterns这个数组的长度是5的话,那就把数组中最后一个下标的值定义为空字符串
                // 多余的加的一个知识点,条件判断

                Regionn region = new Regionn();
                // Regionn���Զ���ķ�����

                region.setId(id);// �Ѵ�info.txt�ļ���ȡ����һ�����ַָ���ַ����������
                // Ȼ�������������±�Ϊ0���ַ���Regionn������е�setId()�ķ�������Ϊ������
                region.setName(name);
                region.setAvgIncome(avgIncome);
                region.setSuperRegion(superRegion);
                region.setBoss(boss);

                results.add(region);// ������б��ĩβ���ָ�����
                // List�ǹ����б?��ĩβ���region������ŵ�����String���͵ģ�
                // Ȼ�������ŵ�List��һ�������г����������б�

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {// 最后,如果继续读取的不是空的话
                try {
                    br.close();// 一个循环后执行操作关闭继续读取
                } catch (IOException e) {
                    e.printStackTrace();// 返回异常
                }
            }
        }

        return results;

    }
}

代码截图:


 
RegionInfoParser01.png
 
RegionInfoParser02.png

思路:

现在需要一个List的包装类,把得到的集合数据放到List<Regionn> regions这个集合类中去

RegionList.java 代码

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="regions")//这些@是把内容输出到xml文件中的意思
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {

    @XmlElement(name="regions")
    private List<Regionn> regions;//定义一个集合类
    
    public RegionList(){
        regions=new ArrayList<Regionn>();
        //构造函数中的这个regions 是一个集合  new一个新的集合
    }
    
    
    public void setRegions(List<Regionn> regions){
        this.regions=regions;//(List<Regionn> regions)传入一个参数是一个集合
    }
    
    public List<Regionn> getRegions(){
        return regions;//List<Regionn>是这个方法的返回值类型,getRegions得到这个集合
    }
    
    public void addRegion(Regionn region){
        this.regions.add(region);//region是传入的参数,把这个类中的内容add添加到这个List列表中,List滚动列表
    }

}

代码截图:


 
RegionList01.png

思路:

现在全部的准备操作已经完成,现在是用JAXB来存入数据到xml文件中去,RegionList文件是为JAXB做准备的,@XmlRootElement(name="regions")//这些@是把内容输出到xml文件中的意思
@XmlAccessorType(XmlAccessType.FIELD)
@XmlElement(name="regions")
private List<Regionn> regions;//定义一个集合类

RegionInfoConverter.java 代码

import java.io.File;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;

public class RegionInfoConverter {

    public static void main(String[] args) {
        
        List<Regionn> regions=RegionInfoParser.parseRegions("info.txt");
        //这是一个List列表,里面有11组数据,一组数据是读出的一行内容分割成的字符串数组
        
        RegionList regionListObj=new RegionList();
        
        //new一个RegionList集合类 ,只是为了传参数
        regionListObj.setRegions(regions);//把得到的regions这个集合中的数据传入
        
        try {
            JAXBContext ctx=JAXBContext.newInstance(RegionList.class);//套路,从RegionList这个Class文件中得到
            //在jaxb中,通常如果声明JAXBContext对象:其实它是一个抽象类
            ctx.createMarshaller().marshal(regionListObj,new File("info.xml"));
         /* marshal 整理,排列,集结 ,regionList是new 的一个RegionList这个类的一个对象,新建一个xml文件,把regionList这个内容所转化出来的数据放入xml文件中
          * Marshaller使客户端应用程序能够将 Java 内容树转换回 XML 数据。
          * 它提供了各种重载的marshal方法。默认情况下,在将 XML 数据生成
          * 到 java.io.OutputStream 或 java.io.Writer 中时,
          * Marshaller 将使用 UTF-8 编码。
          */
        } catch (JAXBException e) {
        
            e.printStackTrace();//返回异常
        }
        }
}

代码截图:


 
RegionInfoConverter.png

实现的内容:


 
image.png

以下是对JAXBContext的操作理解

(1)JAXBContext。 JAXBContext类提供到 JAXB API 的客户端入口点。它提供了管理实现 JAXB 绑定框架操作所需的 XML/Java 绑定信息的抽象,这些操作包括:解组(Unmarshaller )、编组(Marshaller)和验证(Validator)。通常使用JAXBContext.newInstance(XXX.class) 来获取JAXBContext实例(Student是我定义的一个Entity)。

JAXBContext ctx = JAXBContext.newInstance(Student.class)

(2)Unmarshaller。 Unmarshaller 是一个Interface,它管理将 XML 数据反序列化为新创建的 Java 内容树的过程,并可在解组时有选择地验证 XML 数据。它针对如File,InputStream,URL,StringBuffer等各种不同的输入种类,提供各种重载的 unmarshal 方法。unmarshal 方法从不返回 null。如果unmarshal无法将 XML 内容的根解组到 JAXB 映射对象,则抛出 JAXBException。

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Student stu = (Student) unmarshaller.unmarshal(file);

(3)Marshaller。Marshaller使客户端应用程序能够将 Java 内容树转换回 XML 数据。它提供了各种重载的marshal方法。默认情况下,在将 XML 数据生成到 java.io.OutputStream 或 java.io.Writer 中时,Marshaller 将使用 UTF-8 编码。

            Marshaller marshaller = ctx.createMarshaller();         
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);// 格式化输出
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// 设置输出编码,默认为UTF-8        
            marshaller.marshal(stu, xmlFile);

作者: 聪聪工作室



作者:繁花流水congcong
链接:https://www.jianshu.com/p/b6ee0d5b463d
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2018-01-05 19:09  pursuevip  阅读(968)  评论(0编辑  收藏  举报