xml概述及DOM ,SAX 解析方式

1.xml文件是一".xml"名结尾的文件
2.xml 主要用于存储数据,和传输数据
3.xml文件的应用
1)用于不同平台间的通信
2)用于不同平台间的数据共享
3)用于不同应用程序之间的通信
4.在java程序中如何获取xml文件的内容
四种解析方式
Dom
Sax
Dom4j
jDom
前两种是由java提供的解析方式因此不需要去下载jar包,而后两种是相关的组织提供的解析xml的方式因此要去网站下载相关的jar包.
5.dom方式解析步骤
1)创建DocumentBuilderFactory对象
2)创建DocumentBuilder对象
3)通过DocumentBuilder对象的parse方法加载***.xml文件到项目下
 
 

Dom解析方式

1.第一步创建books.xml ,books.xml文 件要在项目的根目录下

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
       <book id ="1">
               <name>冰与火之歌</name>
               <author>乔治马丁</author>
               <year>2014</year>
               <price>88</price>
       </book>
       <book id ="2">
               <name>安徒生童话</name>
               <year>2004</year>
               <price>98</price>
               <language>English</language>
       </book>
</bookstore>

2.创建DOM解析测试类

package com.imooc.domtest;

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

public class DomTest {

	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");
			//通过nodelist的getLength()的方法可以获取booklist的长度
			System.out.println("一共有"+booklist.getLength()+"本书");
			//遍历每一个book节点
			for (int i = 0; i < booklist.getLength(); i++) {
				System.out.println("=================下面开始遍历第" + ( i + 1 ) + "本书的内容=================");
				//通过item(i)方法获取一个book节点,nodelist的索引是从0开始的
				  //(未知属性个数)
				 Node book =booklist.item(i);
				//获取book节点所有属性的集合
				NamedNodeMap attrs =book.getAttributes();
				System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength()+ "个属性");
				//遍历book的属性
				for (int j = 0; j < attrs.getLength(); j++) {
					//通过item(index)获取book节点的某一个属性,index从0开始
					Node attr = attrs.item(j);
					//获取属性名
				    System.out.print("属性名: "+  attr.getNodeName());
					//获取属性值
				    System.out.println("---属性值: "+  attr.getNodeValue());
				}
				
				/**
				 * 已知属性个数
				 * 前提:已经知道book节点有且只能有一个id属性
				 * 将book节点进行强制类型转换,转换成Element
				 */
			        /*  Element book  = (Element) booklist.item(i);
			          //通过getAttribute("id")方法获取属性值
			          String attrValue = book.getAttribute("id");
			  
			          System.out.println("id属性的属性值为:"+attrValue);*/
				//解析book节点的子节点
				    NodeList childNodes =  book.getChildNodes();
				    //遍历childNodes 获取每个节点的节点名和节点值
				    System.out.println("第" + (i+1)+"本书共有"+childNodes.getLength()+"个子节点");
				    for (int k = 0; k < childNodes.getLength(); k++) {
				    	//区分text类型的node以及element类型的node节点
				    	if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){
				    		//获取了element类型节点的节点名
				    		System.out.print("第"+(k+1)+"个节点的节点名 : "
				    				+childNodes.item(k).getNodeName());
				    		//获取了element类型节点的节点值
				    		//System.out.println("  ---节点值  :"+childNodes.item(k).getFirstChild().getNodeValue());
				    		System.out.println("  ---节点值  :"+childNodes.item(k).getTextContent());
				    	}
						
					}
				System.out.println("=================结束遍历第" + ( i + 1 ) + "本书的内容=================");
			
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

3.DOM解析运行的结果

一共有2本书
=================下面开始遍历第1本书的内容=================
第1本书共有1个属性
属性名: id---属性值: 1
第1本书共有9个子节点
第2个节点的节点名 : name  ---节点值  :冰与火之歌
第4个节点的节点名 : author  ---节点值  :乔治马丁
第6个节点的节点名 : year  ---节点值  :2014
第8个节点的节点名 : price  ---节点值  :88
=================结束遍历第1本书的内容=================
=================下面开始遍历第2本书的内容=================
第2本书共有1个属性
属性名: id---属性值: 2
第2本书共有9个子节点
第2个节点的节点名 : name  ---节点值  :安徒生童话
第4个节点的节点名 : year  ---节点值  :2004
第6个节点的节点名 : price  ---节点值  :98
第8个节点的节点名 : language  ---节点值  :English
=================结束遍历第2本书的内容=================

SAX 解析方式

1.创建第一步创建books.xml ,books.xml文 件要在项目的根目录下

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
       <book id ="1">
               <name>冰与火之歌</name>
               <author>乔治马丁</author>
               <year>2014</year>
               <price>88</price>
       </book>
       <book id ="2">
               <name>安徒生童话</name>
               <year>2004</year>
               <price>98</price>
               <language>English</language>
       </book>
</bookstore>

2.创建SAX解析测试类

package com.imooc.test;

import java.io.IOException;

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

import org.xml.sax.SAXException;

import com.imooc.entity.Book;
import com.imooc.handler.SAXParserHandler;

public class SAXTest {

	public static void main(String[] args) {
		//获取SAXParserFactory的实例
		SAXParserFactory factory = SAXParserFactory.newInstance();
        //通过SAXParserFactory的实例(factory) 获取SAXParser实例
		try {
			SAXParser parser =factory.newSAXParser();
			//创建SAXParserHandler 的对象
			SAXParserHandler handler = new SAXParserHandler();
			parser.parse("books.xml", handler);
			System.out.println("~! ~! ~! 共有"+handler.getBookList().size()+"本书");
			for (Book book :handler.getBookList() ) {
				System.out.println(book.getId());
				System.out.println(book.getName());
				System.out.println(book.getAuthor());
				System.out.println(book.getYear());
				System.out.println(book.getPrice());
				System.out.println(book.getLanguage());
				System.out.println("-----finish------");
			}
			
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

2.SAX解析是要通过Sax提供的handler进行对xml解析,所以要创建SAXParserHandler 继承DefaultHandler

package com.imooc.handler;

import java.util.ArrayList;

import javax.xml.stream.events.StartElement;

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

import com.imooc.entity.Book;
public class SAXParserHandler extends DefaultHandler {
	int bookIndex = 0;
	String value = null;
	Book book = null;
	private ArrayList<Book> bookList = new ArrayList<Book>();
    public ArrayList<Book> getBookList() {
		return bookList;
	}

	public void setBookList(ArrayList<Book> bookList) {
		this.bookList = bookList;
	}

/**
    * 用来遍历xml的开始标签
    * 解析xml元素
    */
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
        //调用DefaultHandler类的startElement方法
		super.startElement(uri, localName, qName, attributes);
		//开始解析book元素的属性
		if ( qName.equals("book") ){
			//创建book对象
		    book = new Book();
			bookIndex ++;
			System.out.println("=================开始遍历第"+bookIndex+"本书的内容=================");
			/*//已知属性的名称,根据属性的名称获取属性值
			String value = attributes.getValue("id");
			System.out.println("book的属性值是  :" +value );*/
			//未知book元素下属性的名称以及个数,如何获取属性名和属性值
			int num = attributes.getLength();
			for (int i = 0; i < num; i++) {
				System.out.print("book元素的第"  + (i + 1) + "个属性名是:"
						+ attributes.getQName(i) );
				System.out.println(" --- 属性值是"+ attributes.getValue(i));
				if (attributes.getQName(i).equals("id")) {
					book.setId(attributes.getValue(i));
				}
			}
		} else if (!qName.equals("book") && !qName.equals("bookstore")){
			System.out.print("节点名 :" +qName + "---");
		}
	}
	
	/**
	 * 用来遍历xml的结束标签
	 */
	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		 //调用DefaultHandler类的endElement方法
		super.endElement(uri, localName, qName);
		//判断是否针对一本书已经遍历结束
		if (qName.equals("book")) {
			bookList.add(book);
			book = null;
			System.out.println("=================结束遍历第"+bookIndex+"本书的内容=================");
		} else if (qName.equals("name")){
			book.setName(value);
		} else if (qName.equals("author")){
			book.setAuthor(value);
		} else if (qName.equals("price")){
			book.setPrice(value);
		} else if (qName.equals("year")){
			book.setYear(value);
		} else if (qName.equals("language")){
			book.setLanguage(value);
		}
		
	}
	
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		// TODO Auto-generated method stub
		super.characters(ch, start, length);
	     value = new String(ch, start, length);
	    if (!value.trim().equals("")) {
	    	   System.out.println("节点值是 :"+value);
		}
	 
	}
	/**
	 * 标识解析开始
	 */
	@Override
    public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
		System.out.println("SAX解析开始");
	}
	/**
	 * 标识解析结束
	 */
	@Override
    public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
		System.out.println("SAX解析结束");
	}
	
}

3.如果要将java解析的数据依然有xml的数据结构要创建相应的实体类

package com.imooc.entity;

public class Book {
	private String id;
	private String name;
	private String author;
	private String price;
	private String year;
	private String language;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getPrice() {
		return price;
	}
	public void setPrice(String price) {
		this.price = price;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getLanguage() {
		return language;
	}
	public void setLanguage(String language) {
		this.language = language;
	}
}

4.SAX 解析测试运行结果

SAX解析开始
=================开始遍历第1本书的内容=================
book元素的第1个属性名是:id --- 属性值是1
节点名 :name---节点值是 :冰与火之歌
节点名 :author---节点值是 :乔治马丁
节点名 :year---节点值是 :2014
节点名 :price---节点值是 :88
=================结束遍历第1本书的内容=================
=================开始遍历第2本书的内容=================
book元素的第1个属性名是:id --- 属性值是2
节点名 :name---节点值是 :安徒生童话
节点名 :year---节点值是 :2004
节点名 :price---节点值是 :98
节点名 :language---节点值是 :English
=================结束遍历第2本书的内容=================
SAX解析结束
~! ~! ~! 共有2本书
1
冰与火之歌
乔治马丁
2014
88
null
-----finish------
2
安徒生童话
null
2004
98
English
-----finish------




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值