欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

lucene-用SAX API进行XML解析并索引

程序员文章站 2022-05-15 17:44:16
...

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);

}

}

相关标签: XML lucene