<?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);
// }
}