zoukankan      html  css  js  c++  java
  • java实现xml文件读取并保存到对象

    首先浅聊一下解析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语言----三种循环语句的区别
    选择结构if语句和switch语句的区别
    java中实现多态的机制是什么?
    SpringMVC的运行原理
    Struts1运行原理以及整合步骤
    我回来啦!
    Struts2的运行原理和运行与原理
    初步认识 Web Service
    spring Aop 注解
    mina2.0 spring
  • 原文地址:https://www.cnblogs.com/Chenghao-He/p/6918049.html
Copyright © 2011-2022 走看看