java解析XML文件

本文将简单总结三种不同方式下的xml文件解析,代码及实例截图如下:

一、原生简单的解析,不引入任何jar包

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

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class XMLHelper {
	
	private String xmlFile;
	private DocumentBuilderFactory dbf;
	private DocumentBuilder db;
	private Document doc = null;
	
	private void init(){
		try {
			File file = new File(xmlFile);
			dbf = DocumentBuilderFactory.newInstance();
			db = dbf.newDocumentBuilder();
			doc = db.parse(file);
		}  catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public XMLHelper(String xmlFile){
		this.xmlFile = xmlFile;
		this.init();
	}
	
	// 根据节点名称获取值
	public List<String> getNodeValueByName(String name){
		List<String> list = new ArrayList<String>();
		NodeList nl = doc.getElementsByTagName(name);
		for(int i = 0; i < nl.getLength(); i++){
			//list.add(nl.item(i).getFirstChild().getNodeValue());
			Element e = (Element) nl.item(i);
			list.add("节点名称:"+e.getTagName()+"|节点内容:"+e.getTextContent());
		}
		return list;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		XMLHelper xh = new XMLHelper("E:/zam.xml");
		System.out.println(xh.getNodeValueByName("first"));
		System.out.println(xh.getNodeValueByName("second"));
	}

}


二、DOM解析,一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。这里导入dom4j的核心包dom4j-1.6.1.jar进行解析。

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

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

public class Dom4JTest {
	
	@SuppressWarnings("unchecked")
	public static void getValue(List<Element> list){
	    for (Element element : list) {
	    	if(element != null && element.getText().equals("")){
	    	    System.out.println("节点:" + element.getName() + "----" );
	    	    getValue(element.elements());
	    	}else{
	    	    System.out.println("节点:" + element.getName() + ";值:" + element.getText());
	    	}
	    }
	}
	
	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
	    try {
		//1.创建一个xml解析器对象
		SAXReader reader = new SAXReader();
		//2.读取xml文档,返回Document对象
		Document doc = reader.read(new File("E:/zam.xml"));
		// 将xml格式字符串转化为DOM对象
                //org.dom4j.Document document = DocumentHelper.parseText("");
			
		//获取xml文档的根标签
		Element root = doc.getRootElement();  	
			
		//获取当前标签节点下的所有子节点
		Iterator<Element> it = root.elementIterator(); 
		while(it.hasNext()){
		    Element e = it.next();
		    System.out.println("节点:" + e.getName() + ";值:" + e.getText());
		}
			
		List<Element> list = root.elements();
		getValue(list);
			
		//标签:
	        //Element   ELement.element("标签名") //指定名称的第一个子标签
		//Iterator<Element> Element.elementIterator("标签名");// 指定名称的所有子标签
		//List<Element>	 Element.elements(); //获取所有子标签
				
		//属性:
		//String   Element.attributeValue("属性名") //获取指定名称的属性值
		//Attribute    Element.attribute("属性名");//获取指定名称的属性对象	
		//Attribute.getName()  //获取属性名称
		//Attibute.getValue()  //获取属性值
		//List<Attribute>	 Element.attributes();  //获取所有属性对象
		//Iterator<Attribute>		Element.attibuteIterator(); //获取所有属性对象

		//文本:
		//Element.getText();  //获取当前标签的文本
		//Element.elementText("标签名") //获取当前标签的指定名称的子标签的文本内容
			
	    } catch (Exception e) {
	        e.printStackTrace();
	    }
        }

}

三、SAX解析,加载一点,读取一点,处理一点。对内存要求比较低,Sun公司提供的内置在jdk中,不需要其他jar包。

import java.io.File;

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;

public class SaxTest extends DefaultHandler {
	
    //用来遍历XML文件的开始标签
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        int length = attributes.getLength();
        if(length > 0){
            System.out.println("元素'" + qName + "'的属性是:");
            for(int i=0;i<length;i++){
                System.out.println(" 属性名:" + attributes.getQName(i) + ",属性值: " + attributes.getValue(i));
            }
            System.out.println();
        }
        System.out.print("<" + qName + ">");
    }
 
    //用来遍历XML文件的结束标签
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        System.out.println("<" + qName + "/>");
    }
     
    //文本内容
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        String value = new String(ch, start, length).trim();
        if(!value.equals("")){
        	System.out.print(value);
        }
    }
 
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
    }
     
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }
    
    public static void main(String[] args) {
    	try {
    	    //1.创建SAXParser对象  
    	    SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
    	    //2.调用parse方法
    	    parser.parse(new File("E:/zam.xml"), new SaxTest());	
    	} catch (Exception e) {
    	    e.printStackTrace();
    	}
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值