本文对SAX解析进一步说明。
另外主要给利用SAX解析方法找到指定条件(如标签名称)的xml文档内容。
首先按需要介绍一下DefaultHandler。
DefaultHandler类是SAX2事件处理程序的默认基类。它继承了EntityResolver、DTDHandler、ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法。(注意:ContentHandler是个接口,所以所有的方法的都必须重写;而DefaultHandler是一个实现了ContentHandler的类,所以可以根据选择实现方法)
org.xml.sax.helpers
类 DefaultHandler
java.lang.Object
继承者 org.xml.sax.helpers.DefaultHandler
所有已实现的接口:
ContentHandler, DTDHandler, EntityResolver, ErrorHandler
直接已知子类:
DefaultHandler2
xml文档:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE SwordLibrary SYSTEM "SwordTypeDefinition.dtd"> <SwordLibrary> <Sword sno="s1"> <SwordName>欢欣之刃</SwordName> <Price>1000</Price> <Attack factor="1.0">10</Attack> </Sword> <Sword sno="s2"> <SwordName>夜叉</SwordName> <Price>2050</Price> <Attack factor="2.0">30</Attack> </Sword> <Sword sno="s3"> <SwordName>魔棒</SwordName> <Price type="Dollar">200</Price> <Attack factor="1.0">0</Attack> </Sword> </SwordLibrary>
java代码:
ackage com.shu; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class XmlDemo5 { @Test public void TestMain() throws ParserConfigurationException, SAXException, IOException { // 1.创建解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // 2.得到SAX解析器 SAXParser sax = factory.newSAXParser(); // 3.得到读取器 XMLReader reader = sax.getXMLReader(); // 4.设置内容处理器(即事件处理器:SAX解析器获取一部分内容即触发某一个事件,相应的事件解析器完成相应处理) reader.setContentHandler(new SwordSearchHandler()); // 5.读取xml文档内容 reader.parse("src/JavaLeaner/XmlTest/SwordLib.xml"); } } // 注意DefaultHandler是个类 // DefaultHandler类是SAX2事件处理程序的默认基类。它继承了EntityResolver、DTDHandler、ContentHandler和ErrorHandler这四个接口。包含这四个接口的所有方法,所以我们在编写事件处理程序时,可以不用直接实现这四个接口,而继承该类,然后重写我们需要的方法。 class SwordSearchHandler extends DefaultHandler { //标记当前处理的标签Element名称 String tagCurrent; //设置所要找的剑 String searching="夜叉"; //定位所要找的剑,作为标记 boolean found=false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { this.tagCurrent = qName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if ("SwordName".equals(this.tagCurrent)) { String valueName = new String(ch, start, length); if(searching.equals(valueName)) { this.found=true; } } if (this.found && "Price".equals(this.tagCurrent)) { System.out.print(this.searching+"的价钱是:"+new String(ch, start, length)); //标记关闭 this.found=false; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //标签结束 this.tagCurrent = null; } }
结果运行:
夜叉的价钱是:2050
Java学习之Xml系列五:SAX解析——搜索xml内容
时间: 2024-10-07 04:50:33