美文网首页我爱编程
聪聪工作室---XML---从txt文件中读取内容存到XML文件

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

作者: 繁花流水congcong | 来源:发表于2016-08-08 19:51 被阅读479次

    在实现这个程序中遇到一些编码问题,从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);
    
    

    作者: 聪聪工作室
    业务合作: 18758171751
    微信: 18758171751
    Email: 1099749430@qq.com

    聪聪工作室---Java---独家制作
    版权所有,盗版必究!

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/soursttx.html