SAX解析XML自主判断.docx
- 文档编号:30077896
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:17
- 大小:18.38KB
SAX解析XML自主判断.docx
《SAX解析XML自主判断.docx》由会员分享,可在线阅读,更多相关《SAX解析XML自主判断.docx(17页珍藏版)》请在冰豆网上搜索。
SAX解析XML自主判断
SAX解析XML(自主判断)
实现方法一:
ContentHandler接口:
接收文档逻辑内容的通知的处理器接口
importorg.xml.sax.Attributes;
importorg.xml.sax.ContentHandler;
importorg.xml.sax.Locator;
importorg.xml.sax.SAXException;
classMyContentHandlerimplementsContentHandler{
StringBufferjsonStringBuffer;
intfrontBlankCount=0;
publicMyContentHandler(){
jsonStringBuffer=newStringBuffer();
}
/*
*接收字符数据的通知。
*在DOM中ch[begin:
end]相当于Text节点的节点值(nodeValue)
*/
@Override
publicvoidcharacters(char[]ch,intbegin,intlength)throwsSAXException{
StringBufferbuffer=newStringBuffer();
for(inti=begin;i switch(ch[i]){ case'\\': buffer.append("\\\\");break; case'\r': buffer.append("\\r");break; case'\n': buffer.append("\\n");break; case'\t': buffer.append("\\t");break; case'\"': buffer.append("\\\"");break; default: buffer.append(ch[i]); } } System.out.println(this.toBlankString(this.frontBlankCount)+ ">>>characters("+length+"): "+buffer.toString()); } /* *接收文档的结尾的通知。 */ @Override publicvoidendDocument()throwsSAXException{ System.out.println(this.toBlankString(--this.frontBlankCount)+ ">>>enddocument"); } /* *接收文档的结尾的通知。 *参数意义如下: *uri: 元素的命名空间 *localName: 元素的本地名称(不带前缀) *qName: 元素的限定名(带前缀) * */ @Override publicvoidendElement(Stringuri,StringlocalName,StringqName) throwsSAXException{ System.out.println(this.toBlankString(--this.frontBlankCount)+ ">>>endelement: "+qName+"("+uri+")"); } /* *结束前缀URI范围的映射。 */ @Override publicvoidendPrefixMapping(Stringprefix)throwsSAXException{ System.out.println(this.toBlankString(--this.frontBlankCount)+ ">>>endprefix_mapping: "+prefix); } /* *接收元素内容中可忽略的空白的通知。 *参数意义如下: *ch: 来自XML文档的字符 *start: 数组中的开始位置 *length: 从数组中读取的字符的个数 */ @Override publicvoidignorableWhitespace(char[]ch,intbegin,intlength) throwsSAXException{ StringBufferbuffer=newStringBuffer(); for(inti=begin;i switch(ch[i]){ case'\\': buffer.append("\\\\");break; case'\r': buffer.append("\\r");break; case'\n': buffer.append("\\n");break; case'\t': buffer.append("\\t");break; case'\"': buffer.append("\\\"");break; default: buffer.append(ch[i]); } } System.out.println(this.toBlankString(this.frontBlankCount)+">>>ignorablewhitespace("+length+"): "+buffer.toString()); } /* *接收处理指令的通知。 *参数意义如下: *target: 处理指令目标 *data: 处理指令数据,如果未提供,则为null。 */ @Override publicvoidprocessingInstruction(Stringtarget,Stringdata) throwsSAXException{ System.out.println(this.toBlankString(this.frontBlankCount)+">>>processinstruction: (target=\"" +target+"\",data=\""+data+"\")"); } /* *接收用来查找SAX文档事件起源的对象。 *参数意义如下: *locator: 可以返回任何SAX文档事件位置的对象 */ @Override publicvoidsetDocumentLocator(Locatorlocator){ System.out.println(this.toBlankString(this.frontBlankCount)+ ">>>setdocument_locator: (lineNumber="+locator.getLineNumber() +",columnNumber="+locator.getColumnNumber() +",systemId="+locator.getSystemId() +",publicId="+locator.getPublicId()+")"); } /* *接收跳过的实体的通知。 *参数意义如下: *name: 所跳过的实体的名称。 如果它是参数实体,则名称将以'%'开头, *如果它是外部DTD子集,则将是字符串"[dtd]" */ @Override publicvoidskippedEntity(Stringname)throwsSAXException{ System.out.println(this.toBlankString(this.frontBlankCount)+ ">>>skipped_entity: "+name); } /* *接收文档的开始的通知。 */ @Override publicvoidstartDocument()throwsSAXException{ System.out.println(this.toBlankString(this.frontBlankCount++)+ ">>>startdocument"); } /* *接收元素开始的通知。 *参数意义如下: *uri: 元素的命名空间 *localName: 元素的本地名称(不带前缀) *qName: 元素的限定名(带前缀) *atts: 元素的属性集合 */ @Override publicvoidstartElement(Stringuri,StringlocalName,StringqName, Attributesatts)throwsSAXException{ System.out.println(this.toBlankString(this.frontBlankCount++)+ ">>>startelement: "+qName+"("+uri+")"); } /* *开始前缀URI名称空间范围映射。 *此事件的信息对于常规的命名空间处理并非必需: *当http: //xml.org/sax/features/namespaces功能为true(默认)时, *SAXXML读取器将自动替换元素和属性名称的前缀。 *参数意义如下: *prefix: 前缀 *uri: 命名空间 */ @Override publicvoidstartPrefixMapping(Stringprefix,Stringuri) throwsSAXException{ System.out.println(this.toBlankString(this.frontBlankCount++)+ ">>>startprefix_mapping: xmlns: "+prefix+"=" +"\""+uri+"\""); } privateStringtoBlankString(intcount){ StringBufferbuffer=newStringBuffer(); for(inti=0;i buffer.append(""); returnbuffer.toString(); } } DTDHandler接口: 接收与DTD相关的事件的通知的处理器接口。 importorg.xml.sax.DTDHandler; importorg.xml.sax.SAXException; publicclassMyDTDHandlerimplementsDTDHandler{ /* *接收注释声明事件的通知。 *参数意义如下: *name-注释名称。 *publicId-注释的公共标识符,如果未提供,则为null。 *systemId-注释的系统标识符,如果未提供,则为null。 */ @Override publicvoidnotationDecl(Stringname,StringpublicId,StringsystemId) throwsSAXException{ System.out.println(">>>notationdeclare: (name="+name +",systemId="+publicId +",publicId="+systemId+")"); } /* *接收未解析的实体声明事件的通知。 *参数意义如下: *name-未解析的实体的名称。 *publicId-实体的公共标识符,如果未提供,则为null。 *systemId-实体的系统标识符。 *notationName-相关注释的名称。 */ @Override publicvoidunparsedEntityDecl(Stringname, StringpublicId, StringsystemId, StringnotationName)throwsSAXException{ System.out.println(">>>unparsedentitydeclare: (name="+name +",systemId="+publicId +",publicId="+systemId +",notationName="+notationName+")"); } } EntityResolver接口: 是用于解析实体的基本接口 importjava.io.IOException; importorg.xml.sax.EntityResolver; importorg.xml.sax.InputSource; importorg.xml.sax.SAXException; publicclassMyEntityResolverimplementsEntityResolver{ /* *允许应用程序解析外部实体。 *解析器将在打开任何外部实体(顶级文档实体除外)前调用此方法 *参数意义如下: *publicId: 被引用的外部实体的公共标识符,如果未提供,则为null。 *systemId: 被引用的外部实体的系统标识符。 *返回: *一个描述新输入源的InputSource对象,或者返回null, *以请求解析器打开到系统标识符的常规URI连接。 */ @Override publicInputSourceresolveEntity(StringpublicId,StringsystemId) throwsSAXException,IOException{ returnnull; } } ErrorHandler接口: 是错误处理程序的基本接口 importorg.xml.sax.ErrorHandler; importorg.xml.sax.SAXException; importorg.xml.sax.SAXParseException; publicclassMyErrorHandlerimplementsErrorHandler{ /* *接收可恢复的错误的通知 */ @Override publicvoiderror(SAXParseExceptione)throwsSAXException{ System.err.println("Error("+e.getLineNumber()+"," +e.getColumnNumber()+"): "+e.getMessage()); } /* *接收不可恢复的错误的通知。 */ @Override publicvoidfatalError(SAXParseExceptione)throwsSAXException{ System.err.println("FatalError("+e.getLineNumber()+"," +e.getColumnNumber()+"): "+e.getMessage()); } /* *接收不可恢复的错误的通知。 */ @Override publicvoidwarning(SAXParseExceptione)throwsSAXException{ System.err.println("Warning("+e.getLineNumber()+"," +e.getColumnNumber()+"): "+e.getMessage()); } } 测试类 importjava.io.FileNotFoundException; importjava.io.FileReader; importjava.io.IOException; importorg.xml.sax.ContentHandler; importorg.xml.sax.DTDHandler; importorg.xml.sax.EntityResolver; importorg.xml.sax.ErrorHandler; importorg.xml.sax.InputSource; importorg.xml.sax.SAXException; importorg.xml.sax.XMLReader; importorg.xml.sax.helpers.XMLReaderFactory; publicclassTest{ publicstaticvoidmain(String[]args)throwsSAXException, FileNotFoundException,IOException{ //创建处理文档内容相关事件的处理器 ContentHandlercontentHandler=newMyContentHandler(); //创建处理错误事件处理器 ErrorHandlererrorHandler=newMyErrorHandler(); //创建处理DTD相关事件的处理器 DTDHandlerdtdHandler=newMyDTDHandler(); //创建实体解析器 EntityResolverentityResolver=newMyEntityResolver(); //创建一个XML解析器(通过SAX方式读取解析XML) XMLReaderreader=XMLReaderFactory.createXMLReader(); /* *设置解析器的相关特性 *http: //xml.org/sax/features/validation=true表示开启验证特性 *http: //xml.org/sax/features/namespaces=true表示开启命名空间特性 */ reader.setFeature("http: //xml.org/sax/features/validation",true); reader.setFeature("http: //xml.org/sax/features/namespaces",true); //设置XML解析器的处理文档内容相关事件的处理器 reader.setContentHandler(contentHandler); //设置XML解析器的处理错误事件处理器 reader.setErrorHandler(errorHandler); //设置XML解析器的处理DTD相关事件的处理器 reader.setDTDHandler(dtdHandler); //设置XML解析器的实体解析器 reader.setEntityResolver(entityResolver); //解析books.xml文档 reader.parse(newInputSource(newFileReader("books.xml"))); } } 测试XML文档 xmlversion="1.0"encoding="GB2312"? > //test.org/books"> --books'scomment--> 实现方法二: SaxHandler类 importorg.xml.sax.Attributes; importorg.xml.sax.SAXException; importorg.xml.sax.helpers.DefaultHandler; publicclassSaxHandlerextendsDefaultHandler{ /*此方法有三个参数 arg0是传回来的字符数组,其包含元素内容 arg1和arg2分别是数组的开始位置和结束位置*/ @Override publicvoidcharacters(char[]arg0,intarg1,intarg2)throwsSAXException{ Stringcontent=newString(arg0,arg1,arg2); System.out.println(content); super.characters(arg0,arg1,arg2); } @Override publicvoidendDocument()throwsSAXException{ System.out.println("\n…………结束解析文档…………"); super.endDocument(); } /*arg0是名称空间 arg1是包含名称空间的标签,如果没有名称空间,则为空 arg2是不包含名称空间的标签*/ @Override publicvoidendElement(Stringarg0,Stringarg1,Stringarg2) throwsSAXException{ System.out.println("结束解析元素"+arg2); super.endElement(arg0,arg1,arg2); } @Override publicvoidstartDocument()throwsSAXException{ System.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SAX 解析 XML 自主 判断