#2
FeiJ2013-12-16 11:25
SAX能处理大型的XML文件。对工作人员更灵活,可以用SAX建立自己的XML对象模型。SAX在概念上与DOM完全不同。首先,不同于DOM的文档驱动,它是事件驱动的,也就是说,它并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。所谓事件驱动,是指一种基于回调(callback)机制的程序运行方法。也可以把它称为授权事件模型。
SAX怎么读取XML文件呢??? 看下边的例子。 <?xml version="1.0" encoding="UTF-8"?> <emps> <emp id="1"> <name>zhangsan</name> <sex>man</sex> </emp> <emp id="2"> <name>lisi</name> <sex>women</sex> </emp> </emps> 命名为example.xml 在本例中我们将读取元素<emp>的属性id=1和id=2,代码如下: import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; public class SAXParserTest extends DefaultHandler{ public SAXParserTest() { super(); } public void startElement(String uri,String localName,String qName,Attributes attr){ if(attr.getLength()>0){ for(int i = 0;i<attr.getLength();i++){ System.out.println(attr.getQName(i)+" = "+attr.getValue(i)); } } } public static void main(String[] args){ try{ //实例化用于分析的工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //实例化分析类 SAXParser parser = factory.newSAXParser(); SAXParserTest handler = new SAXParserTest(); parser.parse("example.xml",handler); }catch(Exception e){ System.out.println(e.toString()); } } } 二、获取元素块名字属性值 <?xml version="1.0"?> <?xml-stylesheet type="text/xsl"?> <property> <name>search.response.default.numrows</name> <value>10</value> <description> The default number of rows to return if none is specified. </description> </property> <property> <name>searcher.response.maxage</name> <value>86400</value> <description> The maxage of a response in seconds. Used in caching headers. </description> </property> </configuration> 命名为nutch-default.xml 在本例中我们将读取<name>和<value>所表示的值,即<name>=<value>,代码如下: import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.SAXException; import java.util.Properties; public class SAXParserTest2 extends DefaultHandler{ private Properties props; //用于存放名字属性对(key-value) private String currentName; //当前扫描到的键值 private StringBuffer currentValue = new StringBuffer(); //当前名字对应的值 private String Name,Value;//键值对 public SAXParserTest2(){ super(); this.props=new Properties(); } public void startElement(String uri,String localName,String qName,Attributes attr){ currentValue.delete(0,currentValue.length()); this.currentName=qName; } //碰到节点开始和结束之间的字符<element>***</element> public void characters(char[] ch,int start,int length) throws SAXException{ currentValue.append(ch,start,length); } //碰到节点结束</element> public void endElement(String uri,String localName,String qName){ String name=currentName,value=currentValue.toString().trim(); if(name!=""&&value!="") System.out.println(name+"="+value); if(name=="name") Name=value; if(name=="value") Value=value; if(qName=="property") props.put(Name,Value); this.currentName=""; currentValue.delete(0,currentValue.length()); } public String getElementValue(String elementName){ //elementValue:对应于elementName的节点的属性值 String elementValue=null; elementValue=props.getProperty(elementName); return elementValue; } public static void main(String[] args) { try{ SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); SAXParserTest2 handler = new SAXParserTest2(); parser.parse("nutch-default.xml",handler); System.out.println(handler.getElementValue("searcher.response.maxage ")); }catch(Exception e){ System.out.println(e.toString()); } } } |
用sax解析xml文件,文件中有单标签怎么处理? 求大神解答。。。。。。。。。