首先浅聊一下解析xml的四种方式:

1.DOM方式:有缺点但是这个缺点却也是他的优点。下面详细介绍:

以树形的层次结构组织节点或信息片断集合,可以获得同一个文档中的多处不同数据。使用起来简单。

优点是:可以获得同一个文档中的多处不同数据,使用起来简单。

缺点是:需要加载整个xml文件,这对内存和资源有一定的消耗,如果是小型的xml文件可以尝试用 DOM方式解析。

测试当用DOM方式读取大小为10M的文件时, 将会产生内存溢出异常。

2.SAX方式:在读取数据时检查数据,不用解析整个文档,因此不需要将数据存储在内存中。可以避免DOM方式中的内存溢出。

优点:不用考虑在xml文档在加载时的内存消耗过大。

缺点:在用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

3.DOM4J方式:DOM4J性能最好,连Sun的JAXM也在用DOM4J.目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的hibernate也用DOM4J来读取XML配置文件。考虑可

DOM4J的可移植性不好。

4.JDOM方式:  JDOM自身不包含解析器。它通常使用SAX2解析器来解析和证输入XML文档

下面是用DOM方式实现xml文件的读取并转化为Java类对象:

DOM方式:

xml文件代码 xmlPojo.xml:

<?xml version="1.0" encoding="UTF-8"?>  
    <items>  
        <item id="328">  
            <name>name1</name>  
            <size>23</size>  
        </item>  
        <item id="303">  
            <name>name2</name>  
            <size>22</size>  
        </item>  
   </items>

xml文件内容对应的java类:

public class XmlPojo{

String id;

String name;

String size;

......

setter AND getter 方法

}

xml读取的实现类:

import java.io.IOException;  
    import java.io.InputStream;  
    import java.util.ArrayList;  
    import java.util.List;  
    import javax.xml.parsers.DocumentBuilder;  
    import javax.xml.parsers.DocumentBuilderFactory;  
    import javax.xml.parsers.ParserConfigurationException;  
    import org.w3c.dom.Document;  
    import org.w3c.dom.Element;  
    import org.w3c.dom.Node;  
    import org.w3c.dom.NodeList;  
    import org.xml.sax.SAXException;  
      
    public class DomTest {  
      
        public static void main(String[] args) {  
            List<XmlPojo> list = new DomTest().parseXmlPojo();  
            //打印读取的结果。  
            for (XmlPojo p : list) {  
                System.out.println(p);  
            }  
      
        }  
          
        //解析xml文件,并把结果封装至XmlPojo的集合中返回  
        private List<XmlPojo> parseXmlPojo() {  
            List<XmlPojo> xmlPojoList = null;  
            try {  
                //获得dom制造工厂  
                DocumentBuilderFactory factory = DocumentBuilderFactory  
                        .newInstance();  
                //获得dom解析器  
                DocumentBuilder builder = factory.newDocumentBuilder();  
                //获得xml文件的输入流  
                InputStream inStream = DomTest.class.getClassLoader()  
                        .getResourceAsStream("xmlPojo.xml");  
                //通过解析器得到Document对象  
                Document document = builder.parse(inStream);  
                //得到要获取的所有item 结点,通过每个结点,获取每个item的内容数据。  
                NodeList list = document.getElementsByTagName("item");  
                xmlPojoList = new ArrayList<XmlPojo>();  
                XmlPojo xmlPojo= null;  
                //遍历person集合,将数据封装于xmlPojo对象中  
                for (int i = 0, size = list.getLength(); i < size; i++) {  
                    xmlPojo = new XmlPojo();  
                    //得到<person>结点  
                    Element e = (Element) list.item(i);  
                    //获取其id属性  
                    String id = e.getAttribute("id");  
                    xmlPojo.setId(Integer.valueOf(id));  
                    //得到当前<person>结点的所有孩子结点。  
                    NodeList chileList = e.getChildNodes();  
                    //遍历所有孩子结点,以便获得其余数据。  
                    for (int j = 0, csize = chileList.getLength(); j < csize; j++) {  
                        Node node = chileList.item(j);  
                        switch (node.getNodeName()) {  
                        case "name":  
                            //当结点为<name>时,获取内容,并给xmlPojo赋值  
                            String name = node.getTextContent();  
                            xmlPojo.setName(name);  
                            break;  
                        case "size":  
                            //当结点为<age>时,获取内容,并给xmlPojo赋值  
                            String size = node.getTextContent();  
                            xmlPojo.setSize(Integer.valueOf(size));  
                            break;  
                        }  
                    }  
                    //完成一个<xmlPojo>结点的遍历,将xmlPojo对象加入集合中。  
                    xmlPojoList.add(xmlPojo);  
                    //清空xmlPojo对象的数据。  
                    xmlPojo = null;  
                }  
      
            } catch (ParserConfigurationException e) {  
                e.printStackTrace();  
            } catch (SAXException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            //返回最终得到的数据。  
            return xmlPojoList;  
        }  
    }

java实现xml文件读取并保存到对象的更多相关文章

  1. java操作XML文件--读取内容

          先把问题贴出来:编写一个可以解析xml及修改xml内容的工具类       由于我以前做过Android应用程序开发,之前也解析过xml文件,所以,这道题不是很难,这篇文章我先解决第一个问 ...

  2. Java 操纵XML之读取XML文件

    Java 操纵XML之读取XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...

  3. xml文件读取到数据库

    xml文件读取到数据库   第一步,导包 c3p0,dom4j,jaxen,MySQL-connector 第二步  xml文件,config文件 第三步 javabean 第四步 c3p0的工具类 ...

  4. java中的文件读取和文件写出:如何从一个文件中获取内容以及如何向一个文件中写入内容

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  5. # java对xml文件的基本操作

    下面是简单的总结三种常用的java对xml文件的操作 1. dom方式对xml进行操作,这种操作原理是将整个xml文档读入内存总,在内存中进行操作,当xml文档非常庞大的时候就会出现内存溢出的异常,这 ...

  6. java对xml文件做增删改查------摘录

    java对xml文件做增删改查 package com.wss; import java.io.File;import java.util.ArrayList;import java.util.Lis ...

  7. Java学习-019-Properties 文件读取实例源代码

    在这几天的学习过程中,有开发的朋友告知我,每个编程语言基本都有相应的配置文件支持类,像 Python 编程语言中支持的 ini 文件及其对应的配置文件读取类 ConfigParse,通过这个类,用户可 ...

  8. Java解析xml文件遇到特殊符号&会出现异常的解决方案

    文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...

  9. php xml 文件读取 XMLReader

    php xml 文件读取 <?php /** $xmlString = '<xml> <persons count="10"> <person ...

随机推荐

  1. COGS 2581 无聊的会议V2

    传送 题目大意 给定一个长为\(n\)的序列,定义\(y\)在三元对\((x,y,z)\)中成为中心轴当且仅当同时满足:\(a_x = a_y = a_z,y-x=z-y,x<y<z\)对 ...

  2. CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现

    CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三:CR ...

  3. 2012年浙大:Sharing

    题目描述: To store English words, one method is to use linked lists and store a word letter by letter. T ...

  4. UVa 714 Copying books 贪心+二分 最大值最小化

    题目大意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相 ...

  5. java的动态代理原理

    之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白.比如说:InvocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的,直到前几个星期才把这些问题全部搞明白了.  ...

  6. WPF访问UserControl的自定义属性和事件

    要实现外部窗体能直接访问UserControl的属性必须把UserControl的属性定义为依赖属性: 一,在UserControl.cs中为TextBox控件的Text建立依赖属性,输入" ...

  7. 1.14不使用回车键来读取n个字符

    read是一个重要的bash命令,它用于从键盘或标准输入中读取文本.可以使用read以交互的形式读取来自用户的输入,不过read能做的远不止这些.很多编程语言的输入库都是从键盘读取输入,且只有回车键按 ...

  8. ASP.NET web application中的redirect

    在开发ASP.NET MVC web application过程中,开发上线了新系统后,需要把老系统的url redirect新系统下 其中在项目系统目录下有一个文件 301RedirectsPage ...

  9. sqlserver2012——EXCEPT差查询

    代表第一个select查询结果与第二个select查询结果去除相交后的数据

  10. 推荐一款让你纵横Github的读码神器

    当我们想深入了解一个开源项目的时候,通常我们有以下几种姿势: 懒汉型 通过Web的方式,逐个的点击页面寻找和查看具体的源码内容. 优点:不依赖任何工具,无须任何额外的操作 缺点:效率低下,查找文件不便 ...