XML解析

来源:互联网 发布:淘宝直通车协议 编辑:程序博客网 时间:2023/02/03 02:51

XML解析主要有三种方式:

1.DOM解析

2.Dom4j解析

3.SAX解析

下面我来一一用代码写一遍:

XML文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<students>
  <student sid="1" sname="hug">
    <sage>140</sage>
    <ssex>男</ssex>
  </student>
  <student sid="2" sname="hug2">
    <sage>120</sage>
    <ssex>男</ssex>
  </student>
</students>


1.DOM解析

 package com.zking.test;

import Java.io.File;
import java.io.IOException;

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;

/**
 * 使用DOM解析XML
 * @author Administrator
 *
 */
public class TestParseXMLByDOM {
    
    public static void main(String[] args) {
        try {
            //1.实实例化DocumentBuilderFactory
            DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
            //2.通过dbf获取DocumentBuilder
            DocumentBuilder db=dbf.newDocumentBuilder();
            //3.解析
            Document document=db.parse(new File("students.xml"));
            //4.获取跟节点<students>
            Element students=document.getDocumentElement();
            //5.获取所有的<student>节点
            NodeList nodeList=students.getElementsByTagName("student");
            for (int i = 0; i < nodeList.getLength(); i++) {
                //node element
                Element student=(Element) nodeList.item(i);
                //获取属性
                String sid=student.getAttribute("sid");
                String sname=student.getAttribute("sname");
                
                //获取<student>下面的<sage><ssex>
                Element elementSage=(Element) student.getElementsByTagName("sage").item(0);
                Element elementSsex=(Element) student.getElementsByTagName("ssex").item(0);
                
                String sage=elementSage.getTextContent();
                String ssex=elementSsex.getTextContent();
                
                System.out.println(sid+" "+sname+" "+sage+" "+ssex);
            }
            
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


2.Dom4j解析

使用Dom4j时先需要下载jar包,下载地址 http://www.dom4j.org/dom4j-1.6.1/


package com.zking.test;

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

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 使用dom4j解析XML
 * @author Administrator
 *
 */
public class TestParseXMLByDom4j {
    public static void main(String[] args) {
        try {
            SAXReader saxReader=new SAXReader();
            Document document=saxReader.read(new File("students.xml"));
            Element root=document.getRootElement();
            List<Element> student=root.elements("student");
            for (Element element : student) {
                String sid=element.attributeValue("sid");
                String sname=element.attributeValue("sname");
                
                //拿到子标签
                Element elementSage=element.element("sage");
                Element elementSsex=element.element("ssex");
                

                //根据拿到的子标签拿值

                String sage=elementSage.getTextTrim();
                String ssex=elementSsex.getTextTrim();
                
                System.out.println(sid+" "+sname+" "+sage+" "+ssex);
            }
            
            
            
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}


3.SAX解析

 package com.zking.test;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 使用SAX解析XML
 * @author Administrator
 *
 */
public class TestParseXMLBySAX {
    public static void main(String[] args) {
        try {
            //1.实例化SAXParserFactory
            SAXParserFactory spf=SAXParserFactory.newInstance();
            //2.通过spf获取SAXParser
            SAXParser saxParser=spf.newSAXParser();
            //3.开始解析
            saxParser.parse(new File("students.xml"), new DefaultHandler(){ //在DefaultHandler重写charactersendElement、startElement方法
                String currentTagName=null;
                
                @Override
                public void characters(char[] ch, int start, int length)
                        throws SAXException {
                    super.characters(ch, start, length);
                    if("sage".equals(currentTagName)){
                        String sage=new String(ch, start, length);
                        System.out.println(sage);
                    }else if("ssex".equals(currentTagName)){
                        String ssex=new String(ch, start, length);
                        System.out.println(ssex);
                    }
                }

                @Override
                public void endElement(String uri, String localName,
                        String qName) throws SAXException {
                    super.endElement(uri, localName, qName);
                    currentTagName=null;
                }

                @Override
                public void startElement(String uri, String localName,
                        String qName, Attributes attributes)
                        throws SAXException {
                    super.startElement(uri, localName, qName, attributes);
                    
                    currentTagName=qName;
                    if("student".equals(qName)){
                        String sid=attributes.getValue(0);
                        String sname=attributes.getValue(1);
                        System.out.println(sid+" "+sname);
                    }
                    
                }
                
            });
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
}

DOM解析和SAX解析的区别:

1.DOM解析占用内存比较大,但是方便对XML进行CURD

2.SAX解析有限占用内存小,解析速度快,缺点只适合做文档读取

SAX解析多用于Android开发XML解析

原创粉丝点击