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

SAX解析XML文件

发布时间:2020-12-16 05:58:39 所属栏目:百科 来源:网络整理
导读:java项目文件 package sax;import java.io.File;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.junit.Test;import org.xml

java项目文件

package sax;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxTest {

	@Test
	public void test() throws ParserConfigurationException,SAXException,IOException {
		// 创建定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。
		// 使用SAXParserFactory创建SAX解析工厂
		SAXParserFactory spf = SAXParserFactory.newInstance();
		// 通过SAX解析工厂得到解析器对象
		SAXParser sp = spf.newSAXParser();
		// parse(File f,DefaultHandler dh)使用指定的 DefaultHandler(缺省处理程序)
		// 将指定文件的内容解析为 XML。
		sp.parse(new File("src//sax//sida.xml"),new MyDefaultHandler());

	}

	// 创建内部类,继承DefaultHandler(缺省处理程序)并重写程序执行中用到的方法
	class MyDefaultHandler extends DefaultHandler {
		// 定义开关,用来开启一些方法
		boolean flag = false;

		@Override
		// 重写文档的开始方法,这个方法在装载文档的时候会首先执行
		public void startDocument() throws SAXException {
			// TODO Auto-generated method stub
			super.startDocument();
			System.out.println("startDocument");
		}

		@Override
		// 重写接收元素开始的通知。,当解析出来元素时会调用这个方法
		// uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
		// localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
		// qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
		// attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。
		public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
			// TODO Auto-generated method stub
			super.startElement(uri,localName,qName,attributes);
			// 创建约束条件,只有符合约束的元素才会进入方法,// qName应该是元素对象的名称
			if ("作者".equals(qName)) {
				flag = true;
				System.out.println("startElement");
			}
		}

		@Override
		// 接收元素中字符数据的通知。
		public void characters(char[] ch,int start,int length)
				throws SAXException {
			// TODO Auto-generated method stub
			super.characters(ch,start,length);
			// 首先判断控制开关是否打开
			if (flag) {
				// 输出元素对象,即两个标签之间所标注的文本内容(相当于DOM解析中的getNodeValue();操作)
				System.out.println(new String(ch,length));
			}

		}

		@Override
		// 接收元素结束的通知。
		public void endElement(String uri,String qName)
				throws SAXException {
			// TODO Auto-generated method stub
			super.endElement(uri,qName);
			// 判断操作的标签对象是否符合规范
			if ("作者".equals(qName)) {
				System.out.println("endElement");
				// 关闭方法开关
				flag = false;
			}
		}

		@Override
		// 接收文档结束的通知。
		public void endDocument() throws SAXException {
			// TODO Auto-generated method stub
			super.endDocument();
			//当文档加载完毕时操作此方法
			System.out.println("endDocument");
		}
	}

}
XML文件
<!DOCTYPE 四大名著[
<!ELEMENT 四大名著 (西游记,红楼梦)>
<!ATTLIST 西游记 id ID #IMPLIED>
]>
<四大名著>
	<西游记 id="x001">
		<作者>吴承恩</作者>
	</西游记>
	<红楼梦 id="x002">
		<作者>曹雪芹</作者>
	</红楼梦>
</四大名著>

(编辑:李大同)

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

    推荐文章
      热点阅读