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