package com.parse.sym; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; public class Test { /** * @param args * * XML采用两种方法:Dom4J和SAX * Dom4J优缺点:解析的过程中是把整个XML文件作为一个对象,不管文件有多大,放进到内存中 * 采用的是xpath方式解析XML,即在XML中找到指定节点的路径path,可以直接拿到想要的节点 * 当文件很大时,这种方式不是很理想,所以一般处理小文件 * SAX优缺点: 解析的过程非常类似于流媒体,就是读一点,我就解析一点。所以适合处理大文件 * */ public static void main(String[] args) { //dom4j进行解析 XMLparse parse=new XMLparse(); // try { // parse.dom4jParse("D:\\testxml.xml"); // } catch (DocumentException e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } //sax进行解析 try { parse.saxParse("D:\\testxml.xml"); } 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(); } } } package com.parse.sym; import java.io.File; import java.io.IOException; import java.util.Iterator; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import org.xml.sax.SAXException; public class XMLparse { public void dom4jParse(String pathName) throws DocumentException { File file = new File(pathName); SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(file); Element root = doc.getRootElement(); Element fooElement; for (Iterator<Element> i = root.elementIterator("disk"); i.hasNext();) { fooElement = i.next(); System.out.println("name:" + fooElement.attributeValue("name")); System.out .println("capacity:" + fooElement.elementText("capacity")); System.out.println("directories:" + fooElement.elementText("directories")); System.out.println("files:" + fooElement.elementText("files")); System.out.println(">>>>>>>>>>>>>>>>>>>>"); } } /** * SAX工作原理:在Sax的解析过程中,读取到文档开头、结尾,元素的开头和结尾都会触发一些回调方法,你可以在这些回调方法中进行相应事件处理 * 这四个方法是:startDocument() 、 endDocument()、 startElement()、 endElement * 此外,光读取到节点处是不够的,我们还需要characters()方法来仔细处理元素内包含的内容 * 将这些回调方法集合起来,便形成了一个类,这个类也就是我们需要的触发器 一般从Main方法中读取文档,却在触发器中处理文档, * 这就是所谓的事件驱动解析方法 * 在触发器中,首先开始读取文档,然后开始逐个解析元素,每个元素中的内容会返回到characters()方法 * 接着结束元素读取,所有元素读取完后,结束文档解析 */ public void saxParse(String pathName) throws ParserConfigurationException, SAXException, IOException{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); File file = new File(pathName); SaxHandler dh = new SaxHandler(); parser.parse(file, dh); } } package com.parse.sym; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxHandler extends DefaultHandler{ /* 此方法有三个参数 arg0是传回来的字符数组,其包含元素内容 arg1和arg2分别是数组的开始位置和结束位置 */ @Override public void characters(char[] arg0, int arg1, int arg2) throws SAXException { String content = new String(arg0, arg1, arg2); System.out.println(content); super.characters(arg0, arg1, arg2); } @Override public void endDocument() throws SAXException { System.out.println("\n…………结束解析文档…………"); super.endDocument(); } /* arg0是名称空间 arg1是包含名称空间的标签,如果没有名称空间,则为空 arg2是不包含名称空间的标签 */ @Override public void endElement(String arg0, String arg1, String arg2) throws SAXException { System.out.println("结束解析元素 " + arg2); super.endElement(arg0, arg1, arg2); } @Override public void startDocument() throws SAXException { System.out.println("…………开始解析文档…………\n"); super.startDocument(); } /*arg0是名称空间 arg1是包含名称空间的标签,如果没有名称空间,则为空 arg2是不包含名称空间的标签 arg3很明显是属性的集合 */ public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException { System.out.println("开始解析元素 " + arg2); if (arg3 != null) { for (int i = 0; i < arg3.getLength(); i++) { // getQName()是获取属性名称, System.out.print(arg3.getQName(i) + "=\"" + arg3.getValue(i) + "\""); } } System.out.print(arg2 + ":"); super.startElement(arg0, arg1, arg2, arg3); } } <?xml version="1.0" encoding="UTF-8"?> <HD> <disk name="C"> <capacity>8G</capacity> <directories>200</directories> <files>1580</files> </disk> <disk name="D"> <capacity>10G</capacity> <directories>500</directories> <files>3000</files> </disk> </HD>
饿咕~~(╯﹏╰)b