lucene-用SAX API进行XML解析并索引
1、对XML进行解析使用XML(SAX)的API定义了一个事件驱动的接口。在这个接口中,当某个分析事件发生时,解析器会调用几个方法中的一个响应,而这些方法是由调用程序提供的。这些触发事件包括文档或文档的开始、结束或解析出错。
2、我们使用Xerces2 Java Parser解析器。
3、
XML文档片段
<?xml version='1.0'encoding='utf-8'?>
<adddress-book>
<contact type="individual">
<name>ZanePasolini</name>
<address>999 W.PrinceSt.</address>
<city>NewYork</city>
<province>NY</province>
<postalcode>10013</postalcode>
<country>USA</country>
<telephone>+1 212 3456789</telephone>
</contact>
</address-book>
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<atts.getLength();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);
}
}