第一天学习了dom解析xml的技术,dom是通过树形结构来解析的,一次读入整个文件,而sax是通过顺序的方式读取的,可以一次读入一个片段,效率更高
sax解析通过defaulthander的函数来解析,每个部分会自动触发相应的函数。所在包为org.xml.sax.helpers 。
1):文档开始 public void startDocument()
throws SAXException {} 不进行任何操作。
2):
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
- 接收元素开始的通知。
默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的开始处采取特定的操作(如,分配新的树节点或将输出写入文件)。
参数:
uri
- 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。localName
- 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。qName
- 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。attributes
- 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。3):
public void endElement(String uri, String localName, String qName) throws SAXException
- 接收元素结束的通知。
默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的结束处采取特定的操作(如,结束树节点或将输出写入文件)。
- 指定者:
- 接口
ContentHandler
中的endElement
- 参数:
uri
- 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。localName
- 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。qName
- 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
- 4):
public void endDocument() throws SAXException
- 接收文档结束的通知。
默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在文档的结束处采取特定的操作(如,结束树或关闭输出文件)。
通过这几个函数就可以完成对xml文件的读取。
调用时需要先构造
public abstract class SAXParserFactory extends Object
定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。
SAXParserFactory 对象,
然后通过SAXParserFactory 构造 SAXParser
SAXParser通过函数
parse(String uri, HandlerBase hb)
调用之前写好的defaulthander类。并且传入相关的xml文件的路径既可以了实例:
xml文件:
<?xml version="1.0" encoding="GBK" ?> <address> <person id="名片" 编号="0001"> <name>老王</name> <sex>男</sex> <phone>15520081263</phone> </person> <person id="名片" 编号="0002"> <name>老大</name> <sex>男</sex> <phone>15520081263</phone> </person> </address>
saxtest代码:
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; public class saxTest { /** * @param args */ public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub SAXParserFactory factory=SAXParserFactory.newInstance(); SAXParser saxParser=factory.newSAXParser(); saxParser.parse("src/demo1.xml", new saxHander()); } }
saxHander代码:
import org.omg.CORBA.PUBLIC_MEMBER; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class saxHander extends DefaultHandler { public void startDocument()//读取文档的开始 throws SAXException{ System.out.print("<xml? version="1.0" encoding="GBK"?>"); } public void startElement(String uri, String localName, String qName, Attributes attributes)//表示属性 throws SAXException{//接收元素开始的通知。 System.out.print("<"); //输出名字 System.out.print(qName); //输出属性 for(int i=0;i<attributes.getLength();i++) { System.out.print(" "+attributes.getQName(i)+"="+attributes.getValue(i)); } System.out.println(">"); } public void characters(char[] ch, int start, int length) throws SAXException{//接收元素中字符数据的通知。属于最重要的部分 System.out.print(new String(ch, start, length)); } public void endElement(String uri, String localName, String qName) throws SAXException{//接收元素结束的通知。 System.out.print("</"); System.out.print(qName); System.out.print(">"); } public void endDocument()//读取文档的结束 throws SAXException{ System.out.println("文档读取完毕"); } }
运行结果如下:【可以自行组织saxHander里面函数的操作,获得不同的输出结果】
<xml? version="1.0" encoding="GBK"?><address> <person id=名片 编号=0001> <name> 老王</name> <sex> 男</sex> <phone> 15520080563</phone> </person> <person id=名片 编号=0002> <name> 老大</name> <sex> 男</sex> <phone> 15520080563</phone> </person> </address>文档读取完毕
- 接收文档结束的通知。
- 接收元素结束的通知。