加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML系列:(9)JAXP的SAX解析方式读取XML

发布时间:2020-12-16 02:23:34 所属栏目:百科 来源:网络整理
导读:SAX解析工具- Sun公司提供的。内置在jdk中。org.xml.sax.* SAX核心的API: SAXParser类: 用于读取和解析xml文件对象 parse(File f,DefaultHandler dh)方法: 解析xml文件 参数一: File:表示 读取的xml文件。 参数二: DefaultHandler: SAX事件处理程序

SAX解析工具- Sun公司提供的。内置在jdk中。org.xml.sax.*






SAX核心的API:

SAXParser类: 用于读取和解析xml文件对象

parse(File f,DefaultHandler dh)方法: 解析xml文件

参数一: File:表示 读取的xml文件。

参数二: DefaultHandler: SAX事件处理程序。使用DefaultHandler的子类

DefaultHandler类的API:

void startDocument() : 在读到文档开始时调用

void endDocument() :在读到文档结束时调用

void startElement(String uri,String localName,String qName,Attributes attributes) :读到开始标签时调用

void endElement(String uri,String qName) :读到结束标签时调用

void characters(char[] ch,int start,int length) : 读到文本内容时调用

	//1.创建SAXParser对象
SAXParserparser=SAXParserFactory.newInstance().newSAXParser();
//2.调用parse方法
	parser.parse(newFile("./src/contact.xml"),newMyDefaultHandler());


1、读取XML


1.1、展示DefaultHandler的各个事件处理函数

Demo01.java

packagecom.rk.xml.j_sax;

importjava.io.File;

importjavax.xml.parsers.SAXParserFactory;
importjavax.xml.parsers.SAXParser;

/**
*第一个SAX读取xml文件程序
*@authorRK
*
*/
publicclassDemo01
{
	publicstaticvoidmain(String[]args)throwsException
	{
		//1.创建SAXParserFactory工厂
		SAXParserFactoryparserFactory=SAXParserFactory.newInstance();
		//2.创建SAXParser对象
		SAXParserparser=parserFactory.newSAXParser();
		//3.调用parse方法
		/**
		*参数一:xml文档
		*参数二:DefaultHandler的子类
		*/
		parser.parse(newFile("./src/animals.xml"),newMyDefaultHandler01());
		System.out.println("执行结束!");
	}
}


MyDefaultHandler01.java

packagecom.rk.xml.j_sax;

importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;

/**
*SAX处理程序(如何解析xml文档)
*@authorRK
*
*/
publicclassMyDefaultHandler01extendsDefaultHandler
{

	/**
	*开始文档时调用
	*/
	@Override
	publicvoidstartDocument()throwsSAXException
	{
		System.out.println("MyDefaultHandler.startDocument()");
	}

	/**
	*结束文档时调用
	*/
	@Override
	publicvoidendDocument()throwsSAXException
	{
		System.out.println("MyDefaultHandler.endDocument()");
	}

	/**
	*开始标签时调用
	*@paramqName:表示开始标签的标签名
	*@paramattributes:表示开始标签内包含的属性列表
	*/
	@Override
	publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException
	{
		System.out.println("MyDefaultHandler.startElement()==>"+qName);
	}

	/**
	*结束标签时调用
	*@paramqName:结束标签的标签名称
	*/
	@Override
	publicvoidendElement(Stringuri,StringqName)throwsSAXException
	{
		System.out.println("MyDefaultHandler.endElement()==>"+qName);
	}

	/**
	*读到文本内容的时调用
	*@paramch:表示当前读完的所有文本内容
	*@paramstart:表示当前文本内容的开始位置
	*@paramlength:表示当前文本内容的长度
	*/
	@Override
	publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException
	{
		//得到当前文本内容
		Stringcontent=newString(ch,start,length);
		System.out.println("MyDefaultHandler.characters()==>"+content+"==>End");
	}

}



1.2、将XML重新输出的示例

Demo02.java

packagecom.rk.xml.j_sax;

importjava.io.File;

importjavax.xml.parsers.SAXParserFactory;
importjavax.xml.parsers.SAXParser;

publicclassDemo02
{
	publicstaticvoidmain(String[]args)throwsException
	{
		//1.创建SAXParserFactory工厂
		SAXParserFactoryparserFactory=SAXParserFactory.newInstance();
		//2.创建SAXParser对象
		SAXParserparser=parserFactory.newSAXParser();
		//3.创建Handler对象,并调用parse方法
		MyDefaultHandler02handler=newMyDefaultHandler02();
		parser.parse(newFile("./src/animals.xml"),handler);
		//4.结果输出
		Stringcontent=handler.getContent();
		System.out.println(content);
	}
}

MyDefaultHandler02.java

packagecom.rk.xml.j_sax;

importorg.xml.sax.Attributes;
importorg.xml.sax.SAXException;
importorg.xml.sax.helpers.DefaultHandler;

/**
*SAX处理器程序
*@authorRK
*
*/
publicclassMyDefaultHandler02extendsDefaultHandler
{
	//存储xml文档信息
	privateStringBuildersb=newStringBuilder();
	
	//获取xml信息
	publicStringgetContent()
	{
		returnsb.toString();
	}

	/**
	*开始标签
	*/
	@Override
	publicvoidstartElement(Stringuri,Attributesattributes)throwsSAXException
	{
		sb.append("<"+qName);
		//判断是否有属性
		if(attributes!=null)
		{
			for(inti=0;i<attributes.getLength();i++)
			{
				//得到属性名称
				StringattrName=attributes.getQName(i);
				//得到属性值
				StringattrValue=attributes.getValue(i);
				sb.append(""+attrName+"=""+attrValue+""");
			}
		}
		
		sb.append(">");
	}

	/**
	*结束标签
	*/
	@Override
	publicvoidendElement(Stringuri,StringqName)throwsSAXException
	{
		sb.append("</"+qName+">");
	}

	/**
	*文本内容
	*/
	@Override
	publicvoidcharacters(char[]ch,intlength)throwsSAXException
	{
		//得到当前读取的文本
		Stringcontent=newString(ch,length);
		sb.append(content);
	}

}



1.3、更进一步深入:XMLReader和ContentHandler

Demo03.java

packagecom.rk.xml.j_sax;

importjavax.xml.parsers.SAXParserFactory;
importjavax.xml.parsers.SAXParser;
importorg.xml.sax.XMLReader;

publicclassDemo03
{
	publicstaticvoidmain(String[]args)throwsException
	{
		SAXParserFactoryparserFactory=SAXParserFactory.newInstance();
		SAXParserparser=parserFactory.newSAXParser();
		XMLReaderreader=parser.getXMLReader();
		reader.setContentHandler(newMyContentHandler03());
		reader.parse("./src/animals.xml");
	}
}

MyContentHandler03.java

packagecom.rk.xml.j_sax;

importorg.xml.sax.Attributes;
importorg.xml.sax.ContentHandler;
importorg.xml.sax.Locator;
importorg.xml.sax.SAXException;

publicclassMyContentHandler03implementsContentHandler
{

	@Override
	publicvoidsetDocumentLocator(Locatorlocator)
	{
		System.out.println("MyContentHandler03.setDocumentLocator()");
	}

	@Override
	publicvoidstartDocument()throwsSAXException
	{
		System.out.println("MyContentHandler03.startDocument()"+"文档开始");

	}

	@Override
	publicvoidendDocument()throwsSAXException
	{
		System.out.println("MyContentHandler03.endDocument()"+"文档结束");
	}

	@Override
	publicvoidstartPrefixMapping(Stringprefix,Stringuri)throwsSAXException
	{
		System.out.println("MyContentHandler03.startPrefixMapping()");
	}

	@Override
	publicvoidendPrefixMapping(Stringprefix)throwsSAXException
	{
		System.out.println("MyContentHandler03.endPrefixMapping()");
	}

	@Override
	publicvoidstartElement(Stringuri,Attributesatts)throwsSAXException
	{
		System.out.println("MyContentHandler03.startElement()"+"==>StartELement:"+qName);
	}

	@Override
	publicvoidendElement(Stringuri,StringqName)throwsSAXException
	{
		System.out.println("MyContentHandler03.endElement()"+"==>EndElement:"+qName);
	}

	@Override
	publicvoidcharacters(char[]ch,intlength)throwsSAXException
	{
		Stringcontent=newString(ch,length);
		System.out.println("MyContentHandler03.characters()"+"==>characters:"+content);
	}

	@Override
	publicvoidignorableWhitespace(char[]ch,intlength)throwsSAXException
	{
		System.out.println("MyContentHandler03.ignorableWhitespace()");
	}

	@Override
	publicvoidprocessingInstruction(Stringtarget,Stringdata)throwsSAXException
	{
		System.out.println("MyContentHandler03.processingInstruction()");
	}

	@Override
	publicvoidskippedEntity(Stringname)throwsSAXException
	{
		System.out.println("MyContentHandler03.skippedEntity()");
	}

}



以JAXP读取XML的DOM解析方法和SAX解析方法经常进行对比,如下图:

wKioL1c3CAvh-1NOAABFAK--oUE558.png

DOM解析模型如下:

wKiom1c3B2rDSxJjAABPNNYwMEA596.jpg

SAX解析模型如下:

wKioL1c3CGWy6iMzAABeoQklS-U615.jpg



2、思维导图

wKiom1c3BuKj2Z4IAAHGMNgO1_Y609.png

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读