通过代码实例对DOM SAX JDOM DOM4J四种读取文件的方法进行介绍
写在前面:
1、DOM4J方法效率较高,需掌握好
2、DOM SAX是java自身提供
3、JDOM DOM4J为另外提供,需自己向项目中导入jar包,这两种方法相比于前面两种,较为简单。
xml文件
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="1"> <name>我不</name> <author>大冰</author> <year>2017</year> <price>39</price> </book> <book id="2"> <name>童话故事</name> <author>安徒生</author> <year>2000</year> <price>77</price> <language>English</language> </book> </bookstore>
注:
1、<?xml version="1.0" encoding="UTF-8"?> 这句代码是xml文件的标识 其中version是版本 encoding是编码格式
2、<bookstore> 根节点 <book id="1"> 子节点 id为子节点book的属性
一、DOM
package DOM; 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.NamedNodeMap; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import org.w3c.dom.Node; /** * @author Nut * @version 2018年4月3日 上午10:34:24 */ public class DOMtest { public static void test() { // 创建一个DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { // 创建一个DocumentBuilder的对象 DocumentBuilder db = dbf.newDocumentBuilder(); // 通过DocumentBuilder对象的parser方法加载xml文件到当前项目下 Document doc = db.parse("book.xml"); // 获取所有book节点的集合 NodeList bookList = doc.getElementsByTagName("book"); // 通过nodelist的getLength()方法可以获取bookList的长度 System.out.println("一共有" + bookList.getLength() + "本书"); 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 bookAtrr = book.getAttributes(); System.out.println("第 " + (i + 1) + "本书共有" + bookAtrr.getLength() + "个属性"); // 遍历book的属性 for (int j = 0; j < bookAtrr.getLength(); j++) { // 通过item(index)方法获取book节点的某一个属性 Node attr = bookAtrr.item(j); // 获取属性名 System.out.print("属性名:" + attr.getNodeName()); // 获取属性值 System.out.println("--属性值" + attr.getNodeValue()); } /* * // 前提:已经知道book节点有且只能有1个id属性 // 将book节点进行强制类型转换,转换成Element类型 * Element attr = (Element) bookList.item(i); // * 通过getAttribute("id")方法获取属性值 String attrValue = * attr.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++) { 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) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { DOMtest.test(); } }
二、SAX
package SAX; /** * @author Nut * @version 2018年4月3日 下午3:25:19 将xml读取的值存到book对象中,故创建此类 */ public class Book { private String id; private String name; private String author; private String year; private String language; private String price; 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 getYear() { return year; } public void setYear(String year) { this.year = year; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } }
package SAX; import java.util.ArrayList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author Nut * @version 2018年4月3日 下午2:50:54 */ public class SAXParserHandler extends DefaultHandler { String value; Book book; ArrayList<Book> bookList; public SAXParserHandler() { value = null; book = new Book(); bookList = new ArrayList<Book>(); } /* * 用来标识解析开始 (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 startDocument() throws SAXException { super.startDocument(); System.out.println("解析开始"); } /* * 用来标识解析结束 (non-Javadoc) * * @see org.xml.sax.helpers.DefaultHandler#endDocument() */ @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("解析结束"); } /* * 解析xml元素 (non-Javadoc) * * @see org.xml.sax.helpers.DefaultHandler#startDocument() */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if (qName.equals("book")) { System.out.println("---------某一本书开始了----------"); book = new Book(); for (int i = 0; i < attributes.getLength(); i++) { //System.out.println("第"+(i+1)+"个属性名:"+attributes.getQName(i)+"---值为:"+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 + "是"); } } /* * (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 { super.endElement(uri, localName, qName); if (qName.equals("book")) { bookList.add(book); book = null; System.out.println("-----------某一本书结束了-------------"); } else if (qName.equals("name")) { book.setName(value); } else if (qName.equals("author")) { book.setAuthor(value); } else if (qName.equals("year")) { book.setYear(value); } else if (qName.equals("price")) { book.setPrice(value); } else if (qName.equals("language")) { book.setLanguage(value); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); value = new String(ch, start, length); if (!value.trim().equals("")) { System.out.println(value); } } }
package SAX; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; /** * @author Nut * @version 2018年4月3日 下午2:39:08 */ public class SAXtest { public static void test() { SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser saxParser = factory.newSAXParser(); SAXParserHandler handler = new SAXParserHandler(); saxParser.parse("book.xml", handler); System.out.println("-----------------------------------------------------------"); for (Book book : handler.bookList) { System.out.println(book.getId()); System.out.println(book.getName()); System.out.println(book.getAuthor()); System.out.println(book.getPrice()); System.out.println(book.getYear()); System.out.println(book.getLanguage()); System.out.println("222222222222"); } } 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(); } } public static void main(String[] args) { SAXtest.test(); } }
三、JDOM
注:JDOM需要自己导入jar包 Jdom-2.0.5.jar 的官方下载地址这里哦
package JDOM; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.List; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; /** * @author Nut * @version 2018年4月3日 下午4:56:12 */ public class JDOMtest { public static void test() { // 进行对books.xml文件的JDOM解析 // 准备工作 // 1.创建一个SAXBuilder的对象 SAXBuilder saxBuilder = new SAXBuilder(); try { // 2.创建一个输入流,将xml文件加载到输入流中 InputStreamReader in = new InputStreamReader(new FileInputStream("book.xml"), "UTF-8"); // 3.通过saxBuilder的build方法,将输入流加载到saxBuilder中 Document doc = saxBuilder.build(in); // 4.通过document对象获取xml文件的根节点 Element root = doc.getRootElement(); // 5.获取根节点下的子节点的List集合 List<Element> bookList = root.getChildren(); // 继续进行解析 for (Element el : bookList) { System.out.println("======开始解析第" + (bookList.indexOf(el) + 1) + "书======"); // 解析book的属性集合 List<Attribute> attrList = el.getAttributes(); for (Attribute attr : attrList) { // 获取属性名 String attrName = attr.getName(); // 获取属性值 String attrValue = attr.getValue(); System.out.println("属性名:" + attrName + "----属性值:" + attrValue); } // 对book节点的子节点的节点名以及节点值的遍历 List<Element> bookChildren = el.getChildren(); for (Element child : bookChildren) { System.out.println("节点名:" + child.getName() + "----节点值:" + child.getValue()); } System.out.println("======结束解析第" + (bookList.indexOf(el) + 1) + "书======"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (JDOMException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { JDOMtest.test(); } }
四、DOM4J
注:DOM4J需要导入jar包 dom4j-1.6.1.jar下载网址这里哦
package DOM4J; import java.io.File; 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; /** * @author Nut * @version 2018年4月3日 下午7:45:09 */ public class DOM4Jtest { public static void test() { // 解析books.xml文件 // 创建SAXReader的对象reader SAXReader reader = new SAXReader(); try { // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。 Document document = reader.read(new File("book.xml")); // 通过document对象获取根节点bookstore Element bookstore = document.getRootElement(); // 通过element对象的elementIterator方法获取迭代器 Iterator<?> iterator = bookstore.elementIterator(); // 遍历迭代器,获取根节点中的信息(书籍) while(iterator.hasNext()){ System.out.println("=====开始遍历某一本书====="); Element book = (Element) iterator.next(); // 获取book的属性名以及 属性值 List<Attribute> bookAttrs = book.attributes(); for (Attribute attr : bookAttrs) { System.out.println("属性名:" + attr.getName() + "--属性值:" + attr.getValue()); } Iterator<?> itt = book.elementIterator(); while (itt.hasNext()) { Element bookChild = (Element) itt.next(); System.out.println("节点名:" + bookChild.getName() + "--节点值:" + bookChild.getStringValue()); } System.out.println("=====结束遍历某一本书====="); } } catch (DocumentException e) { e.printStackTrace(); } } public static void main(String[] args) { DOM4Jtest.test(); } }