java中四种方式解析XML文件

1.DOM方式解析XML
Dom解析是将xml文件全部载入到内存,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件,与平台无关,java提供的一种基础的解析XML文件的API,理解较简单,但是由于整个文档都需要载入内存,不适用于文档较大时。

2.SAX方式解析XML
基于事件驱动,逐条解析,适用于只处理xml数据,不易编码,而且很难同时访问同一个文档中的多处不同数据

3.JDOM方式解析XML
简化与XML的交互并且比使用DOM实现更快,仅使用具体类而不使用接口因此简化了API,并且易于使用

4.DOM4j方式解析XML
JDOM的一种智能分支,功能较强大,建议熟练使用

下面给出例子:

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
	<book id="1">
		<name>冰与火之歌</name>
		<author>乔治马丁</author>
		<year>2014</year>
		<price>89</price>
	</book>
	<book id="2">
		<name>安徒生童话</name>
		<author>安徒生</author>
		<year>2004</year>
		<price>77</price>
	</book>
	<book id="3">
		<name>think think think</name>
		<author>aaa</author>
		<year>1997</year>
		<price>100</price>
	</book>
</bookstore>
bean类:Book.java

public class Book {
	
	/**
	 * @author lune
	 */
	
	private int id;
	private String name;
	private String author;
	private int year;
	private double price;
	
	/**
	 * @return the id
	 */
	public int getId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return the author
	 */
	public String getAuthor() {
		return author;
	}
	/**
	 * @param author the author to set
	 */
	public void setAuthor(String author) {
		this.author = author;
	}
	/**
	 * @return the year
	 */
	public int getYear() {
		return year;
	}
	/**
	 * @param year the year to set
	 */
	public void setYear(int year) {
		this.year = year;
	}
	/**
	 * @return the price
	 */
	public double getPrice() {
		return price;
	}
	/**
	 * @param price the price to set
	 */
	public void setPrice(double price) {
		this.price = price;
	}
	
	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", author=" + author + ", year=" + year + ", price=" + price + "]";
	}
		
}

1.DOM方式解析XML

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

import com.lune.bean.Book;

/**
 * 用DOM方式读取xml文件
 * @author lune
 */
public class ReadxmlByDom {
	private static DocumentBuilderFactory dbFactory = null;
	private static DocumentBuilder db = null;
	private static Document document = null;
	private static List<Book> books = null;
	static{
		try {
			dbFactory = DocumentBuilderFactory.newInstance();
			db = dbFactory.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
	}
	
	public static List<Book> getBooks(String fileName) throws Exception{
		//将给定 URI 的内容解析为一个 XML 文档,并返回Document对象
		document = db.parse(fileName);
		//按文档顺序返回包含在文档中且具有给定标记名称的所有 Element 的 NodeList
		NodeList bookList = document.getElementsByTagName("book");
		books = new ArrayList<Book>();
		//遍历books
		for(int i=0;i<bookList.getLength();i++){
			Book book = new Book();
			//获取第i个book结点
			org.w3c.dom.Node node = bookList.item(i);
			//获取第i个book的所有属性
			NamedNodeMap namedNodeMap = node.getAttributes();
			//获取已知名为id的属性值
			String id = namedNodeMap.getNamedItem("id").getTextContent();//System.out.println(id);
			book.setId(Integer.parseInt(id));
			
			//获取book结点的子节点,包含了Test类型的换行
			NodeList cList = node.getChildNodes();//System.out.println(cList.getLength());9
			
			//将一个book里面的属性加入数组
			ArrayList<String> contents = new ArrayList<>();
			for(int j=1;j<cList.getLength();j+=2){
				
				org.w3c.dom.Node cNode = cList.item(j);
				String content = cNode.getFirstChild().getTextContent();
				contents.add(content);
				//System.out.println(contents);
			}
			
			book.setName(contents.get(0));
			book.setAuthor(contents.get(1));
			book.setYear(Integer.parseInt(contents.get(2)));
			book.setPrice(Double.parseDouble(contents.get(3)));
			books.add(book);
		}
		
		return books;
		
	}
	
	public static void main(String args[]){
		String fileName = "src/res/books.xml";
		try {
			List<Book> list = ReadxmlByDom.getBooks(fileName);
			for(Book book :list){
				System.out.println(book);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
		
}


2.SAX方式解析XML
需要自定义DefaultHandler处理器

import java.util.ArrayList;
import java.util.List;

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

import com.lune.bean.Book;

/**
 * 用SAX解析xml文件时需要的handler
 * @author lune
 */
public class SAXParseHandler extends DefaultHandler {
	private List<Book> list;         //存放解析到的book数组
	private Book book;               //存放当前解析的book
	
	private String content = null;   //存放当前节点值
	
	/**
	 * 开始解析xml文档时调用此方法
	 */
	@Override
	public void startDocument() throws SAXException {
		
		super.startDocument();
		System.out.println("开始解析xml文件");
		list = new ArrayList<Book>();
	}



	/** 
	 * 文档解析完成后调用此方法
	 */
	@Override
	public void endDocument() throws SAXException {
		
		super.endDocument();
		System.out.println("xml文件解析完毕");
	}



	/**
	 * 开始解析节点时调用此方法
	 */
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		
		super.startElement(uri, localName, qName, attributes);
		
		//当节点名为book时,获取book的属性id
		if(qName.equals("book")){
			book = new Book();
			String id = attributes.getValue("id");//System.out.println("id值为"+id);
			book.setId(Integer.parseInt(id));
		}
		
	}


	/**
	 *节点解析完毕时调用此方法
	 *
	 *@param qName 节点名
	 */
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		
		super.endElement(uri, localName, qName);
		if(qName.equals("name")){
			book.setName(content);
			//System.out.println("书名"+content);
		}else if(qName.equals("author")){
			book.setAuthor(content);
		//	System.out.println("作者"+content);
		}else if(qName.equals("year")){
			book.setYear(Integer.parseInt(content));
		//	System.out.println("年份"+content);
		}else if(qName.equals("price")){
			book.setPrice(Double.parseDouble(content));
		//	System.out.println("价格"+content);
		}else if(qName.equals("book")){			//当结束当前book解析时,将该book添加到数组后置为空,方便下一次book赋值
			list.add(book);
			book = null;
		}	
		
	}



	/** 
	 * 此方法用来获取节点的值
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		
		super.characters(ch, start, length);
		
		content = new String(ch, start, length);
		//收集不为空白的节点值
//		if(!content.trim().equals("")){
//			System.out.println("节点值为:"+content);
//		}
		
	}

	public List<Book> getBooks(){
		return list;
	}
	
}


import java.io.IOException;
import java.util.List;

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

import org.xml.sax.SAXException;
import org.xml.sax.helpers.ParserFactory;

import com.lune.bean.Book;
import com.lune.handler.SAXParseHandler;

/**
 * 用SAX方式读取xml文件
 * @author lune
 */
public class ReadXmlBySAX {

	private static List<Book> books = null;
	
	private  SAXParserFactory sParserFactory = null;
	private  SAXParser parser = null;
	
	
	public List<Book> getBooks(String fileName) throws Exception{
		SAXParserFactory sParserFactory = SAXParserFactory.newInstance();
		SAXParser parser = sParserFactory.newSAXParser();
		
		SAXParseHandler handler = new SAXParseHandler();
		parser.parse(fileName, handler);
		
		return handler.getBooks();
		
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			books = new ReadXmlBySAX().getBooks("src/res/books.xml");
			for(Book book:books){
				System.out.println(book);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}
3.JDOM方式解析XML

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

import com.lune.bean.Book;

import org.jdom2.*;

/**
 * 用JDOM方式读取xml文件
 * @author lune
 */
public class ReadXMLByJDom {
	
	private List<Book> books = null;
	private Book book = null;
	
	public List<Book> getBooks(String fileName){
		SAXBuilder saxBuilder = new SAXBuilder();
		try {
			Document document = saxBuilder.build(new FileInputStream(fileName));
			//获取根节点bookstore
			Element rootElement = document.getRootElement();
			//获取根节点的子节点,返回子节点的数组
			List<Element> bookList = rootElement.getChildren();
			books = new ArrayList<Book>();
			for(Element bookElement : bookList){
				book = new Book();
				//获取bookElement的属性
				List<Attribute> bookAttributes = bookElement.getAttributes();
				for(Attribute attribute : bookAttributes){
					if(attribute.getName().equals("id")){
						String id = attribute.getValue(); //System.out.println(id);
						book.setId(Integer.parseInt(id));
					}
				}
				//获取bookElement的子节点
				List<Element> children = bookElement.getChildren();
				for(Element child : children){
					if(child.getName().equals("name")){
						String name = child.getValue();//System.out.println(name);
						book.setName(name);
					}else if(child.getName().equals("author")){
						String author = child.getValue();
						book.setAuthor(author);//System.out.println(author);
					}else if(child.getName().equals("year")){
						String year = child.getValue();
						book.setYear(Integer.parseInt(year));
					}else if(child.getName().equals("price")){
						String price = child.getValue();
						book.setPrice(Double.parseDouble(price));
					}
					
				}
				
				books.add(book);
				book = null;
				
			}
			
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		} catch (JDOMException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
		return books;
		
	}

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String fileName = "src/res/books.xml";
		List<Book> books= new ReadXMLByJDom().getBooks(fileName);
		for(Book book : books){
			System.out.println(book);
		}
	}

}

4.DOM4j方式解析XML

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

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

import com.lune.bean.Book;

/**
 * 用DOM4J方法读取xml文件
 * @author lune
 */
public class ReadXMLByDom4j {
	
	private List<Book> bookList = null;
	private Book book = null;
	
	public List<Book> getBooks(File file){
		
		SAXReader reader = new SAXReader();
		try {
			Document document = reader.read(file);
			Element bookstore = document.getRootElement();
			Iterator storeit = bookstore.elementIterator();
			
			bookList = new ArrayList<Book>();
			while(storeit.hasNext()){
				
				book = new Book();
				Element bookElement = (Element) storeit.next();
				//遍历bookElement的属性
				List<Attribute> attributes = bookElement.attributes();
				for(Attribute attribute : attributes){
					if(attribute.getName().equals("id")){
						String id = attribute.getValue();//System.out.println(id);
						book.setId(Integer.parseInt(id));
					}
				}
				
				Iterator bookit = bookElement.elementIterator();
				while(bookit.hasNext()){
					Element child = (Element) bookit.next();
					String nodeName = child.getName();
					if(nodeName.equals("name")){
						//System.out.println(child.getStringValue());
						String name = child.getStringValue();
						book.setName(name);
					}else if(nodeName.equals("author")){
						String author = child.getStringValue();
						book.setAuthor(author);
					}else if(nodeName.equals("year")){
						String year = child.getStringValue();
						book.setYear(Integer.parseInt(year));
					}else if(nodeName.equals("price")){
						String price = child.getStringValue();
						book.setPrice(Double.parseDouble(price));
					}
				}
				bookList.add(book);
				book = null;
				
			}
		} catch (DocumentException e) {
		
			e.printStackTrace();
		}
		
		
		return bookList;
		
	}
	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		File file = new File("src/res/books.xml");
		List<Book> bookList = new ReadXMLByDom4j().getBooks(file);
		for(Book book : bookList){
			System.out.println(book);
		}
	}

}

其中后两者需要导入外部jar包.

文章中的源码可在下面地址下载:

http://github.com/clemontine/XMLParser


  • 11
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用多种方式解析XML格式文件,常用的有DOM和SAX两种解析方式。 DOM(Document Object Model)是将整个XML文档以树形结构加载到内存解析方式。它将XML文档解析为一个包含节点对象的树,通过遍历树的节点来获取和操作XML文档的内容。DOM解析方式相对简单,适用于小型XML文件或需要随机访问多个节点的情况。但是,由于将整个XML文档加载到内存,所以对于大型XML文件来说,会占用大量内存,并可能导致内存溢出。 SAX(Simple API for XML)是基于事件驱动的解析方式。在SAX解析,当解析器遇到XML文件的节点时,它会触发事件,然后将事件交给事先注册的事件处理程序进行处理。SAX解析方式不需要将整个XML文档加载到内存,适用于处理大型XML文件。然而,由于SAX是基于事件的,所以只能按顺序读取XML文档而不能随机访问节点。 除了DOM和SAX,还有一些其他的Java解析库可用于解析XML文件,如JDOM、StAX和XPath等。JDOM是基于Java Collections框架的解析库,提供了简单易用的API;StAX是一种流式解析方式,类似于SAX,但API更加易用;XPath是一种用于在XML文档定位节点的查询语言。 通过使用这些Java解析方式,我们可以方便地读取和操作XML格式的文件,提取其的数据并进行处理,使得我们能够轻松地与其他系统进行数据交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值