java如何解析xml文件(上)

周末回去学习了一下xml文件是如何解析的,  主流的方法有四种,即:DOM、SAX、JDOM和DOM4J.

下面是我写的一个xml文件:books.xml


<bookstore>
	<book id="1">
		<name>莽荒纪name>
		<author>我吃西红柿author>
		<year>2014year>
		<price>88price>
	book> <book id="2"> <name>完美世界name> <author>辰东author> <year>2015year> <language>中文language> book> bookstore>

一  、使用DOM解析XML文件

【优点】

      ①允许应用程序对数据和结构做出更改。

      ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。

【缺点】

      ①通常需要加载整个XML文档来构造层次结构,消耗资源大。

package club.itstu.xml_dom;

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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * @author wx
 * 2016年11月13日
 */
public class XMLDomDemo {
	public static void main(String[] args) {
		//创建一个DocumentBuilderFactory的对象
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			//创建一个DocumentBuilder对象
			DocumentBuilder db = dbf.newDocumentBuilder();
			//通过DocumentBuilder对象的parse方法加载books.xml文件到当前项目下
			Document document = db.parse("books.xml");
			//获取所有book节点的集合
			NodeList bookList = document.getElementsByTagName("book");
			//获取bookList的长度
			System.out.println("一共有"+bookList.getLength()+"本书");
			//遍历每一个book节点
			for(int i=0;i"---------下面开始遍历第"+(i+1)+"本书:  ");
				//通过item()获取每一个book节点
				Node book = bookList.item(i);
				//获取book节点的所有属性集合
				NamedNodeMap attrs = book.getAttributes();
				System.out.println("第"+(i+1)+"本书一共有"+attrs.getLength()+"个属性");
				//遍历book的属性
				for(int j=0;j//通过item()方法获取每一个属性
					Node attr = attrs.item(j);
					System.out.println("属性名:"+attr.getNodeName());
					System.out.println("--属性值:"+attr.getNodeValue());
					
				}
				//获取book节点的所有子节点
				NodeList childNodes = book.getChildNodes();
				//获取子节点的个数
				System.out.println("第"+(i+1)+"本书有"+childNodes.getLength()+"个子节点");
				//遍历所有子节点
				for(int j=0;j//区分出text类型的节点以及element类型的节点
					if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){
						System.out.print(childNodes.item(j).getNodeName());
						System.out.println("--"+childNodes.item(j).getTextContent());
						
					}
				}
				System.out.println("第"+(i+1)+"本书遍历完毕---------");
			}
			
		} 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();
		}
	}
}


二 、使用SAX解释XML文件

【优势】

     ①不需要等待所有数据都被处理,分析就能立即开始。

     ②只在读取数据时检查数据,不需要保存在内存中。

     ③可以在某个条件得到满足时停止解析,不必解析整个文档。

     ④效率和性能较高,能解析大于系统内存的文档。

【缺点】

     ①需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),文档越复杂程序就越复杂。

     ②单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。


package club.itstu.xml_sax;

import java.io.IOException;

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

import org.xml.sax.SAXException;

/**
 * @author wx
 * 2016年11月13日
 */
public class SAXDemo {
	public static void main(String[] args) {
		//获取SAXParserFactory的实例
		SAXParserFactory factory = SAXParserFactory.newInstance();
		try {
			//通过factory获取SAXParser的实例
			SAXParser parse = factory.newSAXParser();
			//创建SAXParsrHandler实例
			SAXParsrHandler handle = new SAXParsrHandler();
			parse.parse("books.xml", handle);
		} catch (ParserConfigurationException | SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


package club.itstu.xml_sax;

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

/**
 * @author wx
 * 2016年11月13日
 */
public class SAXParsrHandler extends DefaultHandler {
	int bookIndex = 0;//判断是第几本书
	
	public void startDocument() throws SAXException {
		super.startDocument();
		System.out.println("解析开始");
	}
  	
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		super.startElement(uri, localName, qName, attributes);
		//开始解析book元素的属性
		if(qName.equals("book")){
			bookIndex++;
			System.out.println("----------开始遍历第"+bookIndex+"本书内容----------");
			/*
		 	//已知book元素下的属性名称,通过属性名获取属性值
			String value = attributes.getValue("id");
			System.out.println("book的属性值是: "+value);*/
			//不知道book元素下的属性名,循环遍历属性
			for(int i=0;i"第"+(i+1)+"个属性名:"+attributes.getQName(i));
				System.out.println("---属性值为:"+attributes.getValue(i));
			}
		}else if(!qName.equals("book")&&!qName.equals("bookstore")){
			System.out.print("节点名: "+qName);
		}
	}

	public void endElement(String uri, String localName, String qName) throws SAXException {
		super.endElement(uri, localName, qName);
		if(qName.equals("book")){
			System.out.println("----------结束遍历第"+bookIndex+"本书内容----------");
		}
	}

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

	public void characters(char[] ch, int start, int length) throws SAXException {
		super.characters(ch, start, length);
		String value = new String(ch, start, length);
		if(!value.trim().equals("")){
			System.out.println("---"+value);
		}
		
		
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值