1 2 3 4 5 6 7 8 9 下一页 XML的四种解析方法及源代码(SAX、DOM、JDOM、DOM4J) 第一种:SAX解析 SAX处理机制:SAX是一种基于事件驱动的API。利用SAX解析XML文档,牵涉到两个部分:解析器和事件处理器。解析器负责读取XML文档,并向事件处理器发生事件,如元素开始和元素结束事件;而事件处理器则负责对事件做出响应,对传递的XML数据进行处理。 测试用的xml文件db.xml 1<?xml version="1.0" encoding="UTF-8"?> 2<!--<!DOCTYPE dbconfig SYSTEM "db.dtd">--> 3<dbconfig> 4 <db type="Oracle"> 5 <driver>oracle.JDBC.driver.OracleDriver</driver> 6 <url>jdbc:oracle:thin:@localhost:1521:oracle</url> 7 <user>scott</user> 8 <password>tiger</password> 9 </db> 10</dbconfig>DTD文件db.dtd 1<!ELEMENT dbconfig (db+)> 2<!ELEMENT db (driver,url,user,password)> 3<!ELEMENT driver (#PCDATA)> 4<!ELEMENT url (#PCDATA)> 5<!ELEMENT user (#PCDATA)> 6<!ELEMENT password (#PCDATA)> 7<!ATTLIST db type CDATA #REQUIRED>
SAX解析实例一 org.xml.sax.DefalutHandler类: 可以扩展该类,给出自己的解析实现 SAXPrinter.Java 1import java.io.File; 2 3import javax.xml.parsers.SAXParser; 4import javax.xml.parsers.SAXParserFactory; 5 6import org.xml.sax.Attributes; 7import org.xml.sax.SAXException; 8import org.xml.sax.helpers.DefaultHandler; 9 10public class SAXPrinter extends DefaultHandler 11{ 12 13 /** *//** 14 * 文档开始事件 15 */ 16 public void startDocument() throws SAXException 17 { 18 System.out.println("<?xml version="1.0" encoding="utf-8"?>"); 19 } 20 21 /** *//** 22 * 接收处理指令事件 23 */ 24 public void processingInstruction(String target, String data) throws SAXException 25 { 26 System.out.println("<?"+target+" "+data+"?>"); 27 } 28 29 /** *//** 30 * 元素开始事件 31 * 参数说明: 32 * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。 33 * localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。 34 * qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。 35 * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 36 */ 37 public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException 38 { 39 System.out.print("<"+qName);//输出元素名称 40 int len=attrs.getLength();//元素属性列表长度 41 42 //利用循环输出属性列表 43 for(int i=0;i<len;i++) 44 { 45 System.out.print(" "); 46 System.out.print(attrs.getQName(i)); 47 System.out.print("=""); 48 System.out.print(attrs.getValue(i)); 49 System.out.print("""); 50 } 51 System.out.print(">"); 52 } 53 54 /** *//** 55 * 元素中字符数据事件:接收元素中字符数据 56 * 注意:1.应用程序不要试图读取ch数组指定范围外的数据,(即start至length之外) 57 * 2.有些解析器将使用ignorableWhitespace()方法来报告元素内容中的空白,而不是characters()方法,如:进行有效性验证的解析器 58 */ 59 public void characters(char[] ch, int start, int length) throws SAXException 60 { 61 System.out.print(new String(ch,start,length)); 62 } 63 64 /** *//** 65 * 结束元素事件 66 */ 67 public void endElement(String uri, String localName, String qName) throws SAXException 68 { 69 System.out.print("</"+qName+">"); 70 } 71 72 public static void main(String[] args) 73 { 74 SAXParserFactory spf=SAXParserFactory.newInstance(); 75 76 try 77 { 78 SAXParser sp=spf.newSAXParser(); 79 sp.parse(new File("db.xml"),new SAXPrinter()); 80 } 81 catch (Exception e) 82 { 83 e.printStackTrace(); 84 } 85 } 86}
(责任编辑:admin) |