XML解析DOM (document object model)、SAX(simple API for XML)、 DOM4J 三种解析方法将解析内容存放在对象中和List集合中

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book>
		<title language="中文">三国演义</title>
		<price>39.9</price>
		<author>罗贯中</author>
	</book>
	<book>
		<title language="英文">Harry Potter</title>
		<price>9.9</price>
		<author>JK.Rowling</author>
	</book>
	<book>
		<title language="中文">编程从开始到放弃</title>
		<price>19.8</price>
		<author>蕉太狼</author>
	</book>
</books>

1.先根据xml内容创建一个要存放BOOK的对象类

/**
 * 
 */
package com.book.xml;

/*** <p>Title:Book </p>
* <p>Description: </p>
* <p>Company: </p> 
* @author 
* @date 
*/
public class Book {
	private String title;
	private String language;
	private Double price;
	private String author;
	/**
	 * @return the title
	 */
	public String getTitle() {
		return title;
	}
	/**
	 * @param title the title to set
	 */
	public void setTitle(String title) {
		this.title = title;
	}
	/**
	 * @return the language
	 */
	public String getLanguage() {
		return language;
	}
	/**
	 * @param language the language to set
	 */
	public void setLanguage(String language) {
		this.language = language;
	}
	/**
	 * @return the price
	 */
	public Double getPrice() {
		return price;
	}
	/**
	 * @param price the price to set
	 */
	public void setPrice(Double price) {
		this.price = price;
	}
	/**
	 * @return the author
	 */
	public String getAuthor() {
		return author;
	}
	/**
	 * @param author the author to set
	 */
	public void setAuthor(String author) {
		this.author = author;
	}
	/**
	 * @param title
	 * @param language
	 * @param price
	 * @param author
	 */
	public Book(String title, String language, Double price, String author) {
		super();
		this.title = title;
		this.language = language;
		this.price = price;
		this.author = author;
	}
	/**
	 * 
	 */
	public Book() {
		super();
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "Book [title=" + title + ", language=" + language + ", price=" + price + ", author=" + author + "]";
	}
	

}

2.通过DOM解析xml文件存放到Book对象中

/**
 * 
 */
package com.book.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.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;



/*** <p>Title:BookDOM </p>
	XML解析.
		 *    	底层  字节流  -----字符串, 图片,视频,音频 
		 *     		xml格式
		 *      	json格式
		 *      
		 * 		XML(EXtensible Markup Language) 可扩展标记语言
		 * 		xml有且仅有一个根标签(元素)
		 * 		每个元素都有开标签和关标签.
		 * 		元素可以有子元素
		 * 		元素可以有属性
		 * 		属性值必须用引号括起来
		 * 
		 * 		xml解析: 从xml格式的字符串中,提取出信息的过程称为xml解析
		 * 		第一种解析方式: DOM解析 Document Object Model 文档对象模型.
		 * 			它把完整的xml字符串读入内存,解析成一个树形结构. 你可以根据树形结构的布局提取出你要的数据.
		 * 			优点 : 一次性完成解析, 你不需要写解析过程.你只需要提取自己想要的数据就可以了.
		 * 			缺点 : 如果xml内容过大,会严重占用内容. 
		 * 		第二种解析方式: SAX解析simple Api for XML. 它是基于事件(通知)的解析方式.
		 * 			它并不会把xml内容完全读入内容. 它一点一点读.
		 * 			优点: 内存占用小.
		 * 			缺点: 你需要你自己写解析代码.
		 * */

public class BookDOM {
	public static void main(String[] args) {
		List<Book> bookList = new ArrayList<>();
		//先创建DocumentBuilderFactory对象。
		DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
		//然后在创建 
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			//通过解析xml文件,返回一个Document文件。
			Document document = builder.parse("resource/book.xml");
		
// 			第一种方法,如下,遍历出大的范围,然后for循环遍历小的范围i一个一个找内容
//			NodeList booksList = document.getElementsByTagName("book");
//			for (int i = 0; i < booksList.getLength(); i++) {
//				Element bookNode = (Element) booksList.item(i);
//				Element titleEle = (Element) bookNode.getElementsByTagName("title").item(0);
//				String title = titleEle.getTextContent().trim();
//				String language = titleEle.getAttribute("language");
//				Element priceEle = (Element)bookNode.getElementsByTagName("price").item(0);
//				Double price = Double.parseDouble(priceEle.getTextContent());
//				Element authorEle = (Element)bookNode.getElementsByTagName("author").item(0);
//				String author = authorEle.getTextContent();
//				
//				Book book = new Book(title, language, price, author);
//				bookList.add(book);
//				
//			}
			
			//第二种方法,如果xml文件内容比较有规律,可以如下使用
			NodeList titleList = document.getElementsByTagName("title");
			NodeList priceList = document.getElementsByTagName("price");
			NodeList authorList = document.getElementsByTagName("author");
			
			for(int i=0;i<titleList.getLength();i++) {
				Element titleEle = (Element) titleList.item(i);
				String title = titleEle.getTextContent();
				String language = titleEle.getAttribute("language");
				Element priceEle = (Element)priceList.item(i);
				Double price = Double.parseDouble(priceEle.getTextContent());
				Element authorEle = (Element)authorList.item(i);
				String author = authorEle.getTextContent();
				Book book = new Book(title, language, price, author);
				bookList.add(book);
				
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(bookList);
		
	}
}

3.通过SAX解析xml文件存放到Book对象中

/**
 * 
 */
package com.book.xml;

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

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

/*** <p>Title:MySAX </p>
* <p>Description: </p>
* <p>Company: </p> 
* @author 
* @date 
*/
public class MySAX extends DefaultHandler{
	
	private List<Book> books;
	
	private String  value;//记录每次读取的内容
	
	public List<Book> getBook(){
		
		return books;
	}
	
	@Override
	public void startDocument() throws SAXException {
		System.out.println("开始文档解析-------");
		books = new ArrayList<>();
	}
	/* (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
	 */
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//		System.out.println("----------解析元素开始-------");
//		System.out.println(qName);
		if (qName.equals("book")) {
			Book book = new Book();
			books.add(book);
		}else if (qName.equals("title")) {
			int index = books.size() - 1;
			Book book = books.get(index);
			String language = attributes.getValue("language");
			book.setLanguage(language);
		}
		
	}
	
	
	
	/* (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
	 */
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		 value = new String(ch, start, length);
		
	}
	
	/* (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
	 */
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
//		System.out.println("----------解析元素结束-------");
		if (qName.equals("title")) {
			int index = books.size()-1;
			Book book = books.get(index);
			book.setTitle(value);
		}else if (qName.equals("price")) {
			int index = books.size()-1;
			Book book = books.get(index);
			Double price = Double.parseDouble(value);
			book.setPrice(price);
			
		}else if (qName.equals("author")) {
			int index = books.size()-1;
			Book book = books.get(index);
			book.setAuthor(value);
		}
		
		
	}
	
	/* (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#endDocument()
	 */
	@Override
	public void endDocument() throws SAXException {
		System.out.println("-------------结束文档解析-------");
//		System.out.println(books);
	}
}
/**
 * 
 */
package com.book.xml;

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;

/*** <p>Title:BookSAX </p>
* <p>Description: </p>
* <p>Company: </p> 
* @author 
* @date 
*/
public class BookSAX {
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		//先创建SAXParserFactory 对象。
		SAXParserFactory factory = SAXParserFactory.newInstance();
		//然后创建SAXParser对象。
		SAXParser newSAXParser = factory.newSAXParser();
		//创建继承DefaultHandler类的对象
		MySAX handler = new MySAX();
		//SAXParser对象调用parse解析方法,
		//有两个参数,第一参数是xml文件路劲,第二个路径是继承DefaultHandler的类
		newSAXParser.parse("resource\\book.xml", handler);
		
		List<Book> book = handler.getBook();
		for (Book book2 : book) {
			System.out.println(book2);
		}
		
	}

}

4.通过DOM4J解析xml文件,需要打入dom4j -jar包

1.先在项目下创建一个文件,命名为lib(library的缩写),然后在百度maven repository下,找到dom4j的jar包,如何想使用xPath,则还可以下载jaxen.jar包,就可以使用相对路劲来提取想要的标签内容。找到对应的版本进行下载

2.下载完成后,导入lib目录下,这时候还不能使用,需要右键点击项目,选择Builder Path,选着ADD External 添加外部路劲,然后就可以使用jar包了

 

 3.完成以上两部就可以使用dom4j,如何想使用xPath,则还可以下载jaxen.jar包,就可以使用相对路劲来提取想要的标签内容。

/**
 * 
 */
package com.dom4j;

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

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

import com.book.xml.Book;

/*** <p>Title:BookDOM4J </p>
* <p>Description: </p>
* <p>Company: </p> 
* @author 
* @date 
*/
public class BookDOM4J {

	/**
	 * @param args
	 * @throws Exception 
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		List<Book> bookList = new ArrayList<>();
		//导入dom4j的jar包,所以可以使用SAXReader类
		SAXReader reader = new SAXReader();
		//通过read读取一个文件file或者url路劲获取文档。
		Document document= reader.read("resource\\book.xml");
		
		String asXML = document.asXML();
		System.out.println("获取字符串形式的XML:"+asXML);
		
		Element root = document.getRootElement();
//		System.out.println("获取文档的根:"+root.getName());
		//获取文档的根目录。然后可以得到文档的所有内容。
		List<Element> elements = root.elements("book");
		for (Element element : elements) {
			//获取book下的title
			Element titleEle = element.element("title");
			String title = titleEle.getText();		
			String language = titleEle.attributeValue("language");
			//获取book下的price
			Element priceEle = element.element("price");
			Double price = Double.parseDouble(priceEle.getText());
			//获取book下的author
			Element authorEle = element.element("author");
			String author = authorEle.getText();
			
			Book book = new Book(title, language, price, author);
			bookList.add(book);
			
		}
		System.out.println(bookList);

	}
	
//	public static void main(String[] args) throws Exception {
//
//		List<Book> bookList = new ArrayList<>();
//		//导入dom4j的jar包,所以可以使用SAXReader类
//		SAXReader reader = new SAXReader();
//		//通过read读取一个文件file或者url路劲获取文档。
//		Document document= reader.read("resource\\book.xml");
//		Element root = document.getRootElement();
//		String asXML = document.asXML();
//		System.out.println(asXML+"-------------");
		System.out.println("获取文档的根:"+root.getName());
//		//获取绝对路劲下的节点集合。
//		List<Node> list = document.selectNodes("books//book");
//		//判断该绝对路劲下的节点有多少个list。size();
		System.out.println(list.size());
//		
//		//获取相对路劲下的节点集合
//		List<Node> listXD = document.selectNodes("//book");
//		//这时候我们发现,使用相对路劲和绝对路劲的效果都是一样。所以相对路劲看起来更方便。
		System.out.println(listXD.size());
//		
//		for(int i=0;i<listXD.size()-1;i++) {
//			Node node = listXD.get(i);
//			List<Node> titleList = node.selectNodes("//title");
//			
//			List<Node> priceList = node.selectNodes("//price");
//			
//			List<Node> authorList = node.selectNodes("//author");
//			//因为title和price和author的长度都一样,所以可以写道一个循环里面.
//			for(int j=0;j<titleList.size()-1;j++) {
//				//因为我们下获取title里面的属性,所以需要将Node类型转化成Element类型
//				//这样就可以调用attributeVlaue("language"),找到该属性值了
//				Element titleEle = (Element) titleList.get(i);
//				String title = titleEle.getText();
//				String language = titleEle.attributeValue("language");
//				
//				Element priceEle = (Element)priceList.get(i);
//				Double price = Double.parseDouble(priceEle.getText());
//				
//				Element authorEle = (Element)authorList.get(i);
//				String author = authorEle.getText();
//				Book book = new Book(title, language, price, author);
//				bookList.add(book);
//				
//			}
//		}
//		System.out.println(bookList);
//	}
	
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值