1、对XML进行解析使用XML(SAX)的API定义了一个事件驱动的接口。在这个接口中,当某个分析事件发生时,解析器会调用几个方法中的一个响应,而这些方法是由调用程序提供的。这些触发事件包括文档或文档的开始、结束或解析出错。
2、我们使用Xerces2 Java Parser解析器。
3、
XML文档片段
4、
public class SAXXMLHandler extends DefaultHandler implementsDocument{
privateStringBuffer elementBuffer=new StringBuffer();
privateHashMap attributeMap;
privateDocument doc;
publicDocument getDocument(InputStream is) throwsDocumentHandlerException{//启动解析器
SAXParseFactory spf=SAXParserFactory.newInstance();
try{
SAXParserparser=spf.newSAXParser();
parser.parse(is,this);
}
catch (IOException e){
throw new DocumentHandlerException("cannot parse xmldocument",e);
}
catch (ParserConfigurationException e){
throw new DocumentHandlerException("cannot parse xmldocument",e);
}
catch (SAXException e){
throw new DocumentHandlerException("cannot parse xmldocument",e);
}
return doc;
}
publicvoid startDocument(){//解析开始事件触发这个方法
doc=new Document();
}
publicvoid startElement(String uri,String localName,StringqName,Attributes atts)
throws SAXException{//每当解析器找到一个新的XML元素的起始标志,都会调用startElement方法
elementBuffer.setLength();//清空
attributeMap.clear();//清空上一个元素的相关记录
if (atts.getLength()>0){
attributeMap=new HashMap();
for (int i=0;i attributeMap.put(atts.getQName(i),atts.getValue(i)); } } } publicvoid characters (){在处理独立的XML元素过程,characters可能被多次调用到,找到cdata elementBuffer.append(text,start,length); } publicvoid endElement(Strig uri,String localNmae,String qName){ //当XML元素关闭时调用 if(qName.equals("address-book")){ return; } else if(qName.equals("contact")){ Iterator iter=attributemap.keySet().iterator(); while (iter.hasNext(){ String attName=(String) iter.next(); String attValue=(String) attributeMap.get(attName); doc.add(Field.keyword(attName,attvalue)); } } else{ doc.add(Field.keyword(qName,elementBuffer.toString())); } } public static void main(Stringargs[])throws Exception{ SAXXMLHandler handler=new SAXXMLHandler(); Document doc=handler.getDocument(new FileInputStream(newFile(args[0]))); System.out.println(doc); } }