XML转换为JAVA

将XML文档中的内容转换为JAVA对象共有4中方式它,它们分别是DOM,SAX,DOM4J , JDOM。接下来我用代码演示JAVA官方提供我们的两种方式DOM和SAX。
DOM是JDK自带的接下来我来演示一下怎样获取XML文本中的内容。以下是xml文件中的内容。

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student id="1508022226" stuid="123">
        <name>张三</name>
        <age>12</age>
     </student>

    <student id="1508022223" stuid="456">
        <name>李四</name>
        <age>16</age>
    </student>
</students>

我们通过DOM的方式来获取来获取xml文件中的内容。

public class DOMDemo01 {
    private static DocumentBuilderFactory documentBuilderFactory ;
    private static DocumentBuilder documentBuilder;
    private static Document document;

    public static void main(String[] args) {
        documentBuilderFactory = DocumentBuilderFactory.newInstance();
        try {
            documentBuilder = documentBuilderFactory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        try {
            document = documentBuilder.parse("src/main/resources/xml/student.xml");
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        NodeList parents =  document.getElementsByTagName("student");
        System.out.println("一共有"+parents.getLength()+"个节点");
        for(int i=0;i<parents.getLength();i++){
           Element students = (Element) parents.item(i);
           //获取父标签中的值
           String id = students.getAttribute("id");
           String stuid = students.getAttribute("stuid");
           System.out.println("id : "+id+"  stuid : "+stuid);

           //获取子标签
           NodeList childs = students.getChildNodes();
           //DOM将空白和文件也看作为节点    // System.out.println(childs.getLength());

            //打印student节点的所有标签
            for(int j=0;j<childs.getLength();j++){
                //获取除文本节点和空格节点
                if(childs.item(j).getNodeType() == Node.ELEMENT_NODE){
                    Student student = new Student();
                    System.out.print(childs.item(j).getNodeName() + " : ");
                    //通过childs.item(j).getTextContent()也可以获取节点内容
                    System.out.println(childs.item(j).getFirstChild().getNodeValue());
                }
            }
           
        }
    }
}

以下是输出的内容


image.png

SAX解析XML文件

import org.xml.sax.SAXException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;

public class SAXDemo {
    public static void main(String[] args) {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        try {
            SAXParser parser = factory.newSAXParser();
            SAXHandle saxHandle = new SAXHandle();
            parser.parse("src/main/resources/xml/student.xml",saxHandle);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class SAXHandle extends DefaultHandler {

    /*
     *  用来表示解析的开始
     */
    @Override
    public void startDocument () throws SAXException {
        super.startDocument();
        System.out.println("解析标签开始");
    }

    @Override
    public void endDocument () throws SAXException {
        super.startDocument();
        System.out.println("解析标签结束");
    }

    @Override
    public void startElement (String uri, String localName, String qName,
                              Attributes attributes) throws SAXException {
        super.startElement(uri,localName,qName,attributes);

        if(qName.equals("student") ){
            int length = attributes.getLength();
            for(int i=0;i<length;i++){
                System.out.print(attributes.getQName(i)+" : ");
                System.out.print(attributes.getValue(i)+"     ");
            }
            System.out.println();
        }else if(!qName.equals("student")){
            System.out.print("节点名 : "+qName +"  ");
        }

    }
    /*
     *  用来表示解析的结束
     */
    @Override
    public void endElement (String uri, String localName, String qName)
            throws SAXException {
        super.endElement(uri,localName,qName);
    }


    @Override
    public void characters (char ch[], int start, int length)
            throws SAXException {
        String value = new String(ch,start,length);
        //去掉换行和空制符
        if(!value.trim().equals("")){
            System.out.println(value);
        }
    }

}

运行结果


image.png

总结:DOM解析将文件的内容全部加载在内存中并且形成一个DOM树,如果XML非常大,则DOM很浪费时间。SAX是基于事件的解析,会一步一步的判断每一行的XML文件中的内容,执行开始标签触发startDocument()方法,每走到结束标签都会触发一个endDocument方法。执行完最后标签会执行endDocument方法。
DOM
优点:形成DOM树,实现简单。
缺点: 当XML文件非常大时,对内存消耗比较大,容易影响解析,容易造成内存溢出。
SAX
优点:采用事件的驱动模式,不需要关系赋值节点,按行进行解析。
缺点:不易编码。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一. XML数据交换格式 XML数据交换格式是一种自描述的数据交互格式,虽然XML数据格式不如JSON "轻便",...
    __season____阅读 2,532评论 0 7
  • 什么是XML? XML:extensiable markup language 被称作可扩展标记语言 XML简单的...
    Java3y阅读 2,441评论 5 41
  • 1. XML总结 1.1. XML简介 XML : 可扩展的标记语言。(和HTML非常类似的) 可扩展的。 自定义...
    Ethan_Walker阅读 3,114评论 0 12
  • 吸引力法则 每个人都渴望得到别人的尊重。但要得到别人的尊重,就要先尊重自己,爱自己。如果你连这个都做不到,你就是在...
    缘来是缘8阅读 220评论 0 0
  • 每天早读时,我总爱给孩子们布置两种背诵任务:任务和超任务。 任务:一般有二到三个比较简单的要背诵的内容,保证大部分...
    渑池3112王莉莉阅读 385评论 3 1