java中使用j2SE自带的SAX解析XML文件

    java中的SAX解析XML文件的具体步骤基本分为五部:

        1.获取解析器factory

        2.通过factory获取sax解析器
        3.获取读取器
        4.注册事件处理器

        5.解析xml文件

具体代码如下:

public void saxDomXml() throws ParserConfigurationException,SAXException,IOException
	{
		//1.获取解析器factory
		SAXParserFactory factory=SAXParserFactory.newInstance();
		//2.通过factory获取sax解析器
		SAXParser sp=factory.newSAXParser();
		//3.获取读取器
		XMLReader xmlReader=sp.getXMLReader();
		//4.注册事件处理器
		//xmlReader.setContentHandler(new MyContentHandler());
		//xmlReader.setContentHandler(new MyContentHandler2());
		//5.解析xml文件
		xmlReader.parse("../MyXml.xml");
	}

下面这个类实现了ContentHandler这个接口,该接口默认的方法太多,一般的解析用不到,而且一旦调用了该接口里面的方法会全部实现,过于冗余繁琐。这个类实现的功能就是将一个XML文件完整的解析出来

//快捷键 Alt shift S 调出实现类的方法
	class MyContentHandler implements ContentHandler{

		/**
		 * ch 数组为整个xml文件的内容
		 * start 当前标签提从哪个标签开始
		 * length 标签体长度
		 * */
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			// 打印从ch数组里的start位置上取length个长度
			System.out.println("----打印标签内容---"+new String(ch,start,length));		
		}

		public void startDocument() throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("解析开始");
		}
		
		public void endDocument() throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("解析结束");
		}

		public void startElement(String uri, String localName, String name,
				Attributes arg3) throws SAXException {
			// TODO Auto-generated method stub
			System.out.println("开始标签"+name);
		}
		/**
		 * name 传入的标签名
		 * 
		 * **/
		public void endElement(String uri, String localName, String name)
				throws SAXException {
			// TODO Auto-generated method stub	
		}

		
		public void setDocumentLocator(Locator arg0) {
			// TODO Auto-generated method stub		
		}
		
		public void skippedEntity(String arg0) throws SAXException {
			// TODO Auto-generated method stub		
		}
		public void startPrefixMapping(String arg0, String arg1)
				throws SAXException {
			// TODO Auto-generated method stub		
		}
		
		public void endPrefixMapping(String arg0) throws SAXException {
			// TODO Auto-generated method stub		
		}

		public void ignorableWhitespace(char[] arg0, int arg1, int arg2)
				throws SAXException {
			// TODO Auto-generated method stub	
		}

		public void processingInstruction(String arg0, String arg1)
				throws SAXException {
			// TODO Auto-generated method stub	
		}

	}//MyContentHandler

下面这个类继承自类DefaultHandler,该类实现EntityResolver, DTDHandler, ContentHandler, ErrorHandler这几个接口,不过类中方法没有做操作,当我们需要做具体的解析要求时,比如说只解析某个特定标签,或者只解析哪一个内容这种方式就很方便。

//适配器模式
	/**
	 * 自定义特定的方法,例如只需要打印某个特定的标签、或者只打印第几个标签
	 * */
	class MyContentHandler2 extends DefaultHandler{
		private String eleName=null;
		private int count=0;
		@Override
		public void startElement(String uri, String localName, String name,
				Attributes attributes) throws SAXException {
			// TODO Auto-generated method stub
			super.startElement(uri, localName, name, attributes);
			this.eleName=name;
		}
		
		@Override
		public void characters(char[] ch, int start, int length)
				throws SAXException {
			super.characters(ch, start, length);
			//只打印标签为书名的内容,即所有的关于标签是"书名"的内容全部打印出来
			if ("书名" .equals(eleName)) {
				System.out.println(eleName+"\t标签的内容---"+new String(ch,start,length));
			}
			
			//只想打印第二个标签的内容
			if ("书名" .equals(eleName) && ++count==2) {
				System.out.println(eleName+"\t标签的内容---"+new String(ch,start,length));
			}
		}
		
		@Override
		public void endElement(String uri, String localName, String name)
				throws SAXException {
			// TODO Auto-generated method stub
			super.endElement(uri, localName, name);
			eleName=null;
		}
		
	}//MyContentHandler2

XML文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "../book.dtd">
<书架>
	<书>
		<书名>java</书名>
		<作者>XX</作者>
		<售价>14</售价>
	</书>
	<书>
		<书名>C++</书名>
		<作者>SS</作者>
		<售价>14</售价>
	</书>
</书架>

.dtd文件内容

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值