`
yjshengshe
  • 浏览: 201886 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

sax解析xml实例一

    博客分类:
  • java
 
阅读更多

 解析xml并把xml中用户信息提取出来

 

1 test-b.xml文件

<?xml version="1.0" encoding="UTF-8"?>
	<result>
			<man>
				<name>sky</name>
				<age>25</age>
				<sex>男</sex>
				<demo>人皇</demo>
			</man>
			<man>
				<name>fly</name>
				<age>23</age>
				<sex>男</sex>
				<demo>中国小兽皇</demo>
			</man>
			<woman>
				<name>小仓美眉</name>
				<age>20</age>
				<sex>女</sex>
				<demo>魔兽女子第一人</demo>
			</woman>
			<woman>
				<name>doudou</name>
				<age>20</age>
				<sex>女</sex>
				<demo>美女主持啊</demo>
			</woman>
	</result>

 2 用户信息People类

package com.java.xml.dom;

	public class People {
		
		private String name;
		
		private String age;
		
		private String sex;
		
		private String demo;

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public String getAge() {
			return age;
		}

		public void setAge(String age) {
			this.age = age;
		}

		public String getSex() {
			return sex;
		}

		public void setSex(String sex) {
			this.sex = sex;
		}

		public String getDemo() {
			return demo;
		}

		public void setDemo(String demo) {
			this.demo = demo;
		}
	}

 3 sax自定义handler编写

package com.java.xml.SAX;

	import java.util.ArrayList;
	import java.util.List;

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

	import com.java.xml.dom.People;

	/**
	 * 自定义sax解析器
	 * @author Administrator
	 *
	 */
	public class MySAXHandlerB extends DefaultHandler {
		
		//people集合
		private List<People> userList = new ArrayList<People>(16);
		
		//节点文本内容
		private String content;
		
		//people对象
		private People people = null;
		
		public MySAXHandlerB()
		{
			
		}
		
		public MySAXHandlerB(List<People> userList)
		{
			this.userList = userList;
		}
		
		/**
		 * 文档开始
		 */
		public void startDocument() throws SAXException 
		{
		}
		
		/**
		 * 文档结束
		 */
		public void endDocument() throws SAXException
		{
		}
		
		/**
		 * 节点开始
		 */
		public void startElement(String nameSpaceUri,
				String localName,String qName,
				Attributes attr) throws SAXException
		{	
			//如果有属性,打印属性
			for (int i = 0; i < attr.getLength(); i++)
			{
			}
			
			if ("man".equals(qName) || "woman".equals(qName))
			{
				people = new People();
			}
			
			//清空文本内容
			content = "";
		}
		
		/**
		 * 节点结束
		 */
		public void endElement(String nameSpaceUri,
				String localName,String qName) throws SAXException
		{
			if ("age".equals(qName))
			{
				people.setAge(content);
			}
			
			if ("name".equals(qName))
			{
				people.setName(content);
			}
			
			if ("sex".equals(qName))
			{
				people.setSex(content);
			}
			
			if ("demo".equals(qName))
			{
				people.setDemo(content);
			}
			
			if ("man".equals(qName) || "woman".equals(qName))
			{
				userList.add(people);
			}
		}
		
		/**
		 * 文本获取
		 */
		public void characters(char[] ch,int start,int length) throws SAXException
		{
			//赋予文本内容
			content = new String(ch,start,length).trim();
		}

	}

 4 sax解析xml执行类

package com.java.xml.SAX;

	import java.io.File;
	import java.util.ArrayList;
	import java.util.List;

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

	import com.java.xml.dom.People;

	/**
	 * 为解决DOM的问题,出现了SAX.SAX ,事件驱动。
	 * 当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,
	 * 发送事件,程序员编写响应这些事件的代码,保存数据。
	 * 优点:不用事先调入整个文档,占用资源少;
	 * SAX解析器代码比DOM解析器代码小,适于Applet,下载。
	 * 缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;
	 * 无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;
	 * 使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
	 * @author Administrator
	 *
	 */
	public class SaxB {

		/**
		 * 输出到控制台
		 * @param i
		 * @param people
		 */
		public static void print(int i,People people)
		{
			StringBuffer sb = new StringBuffer(100);
			sb.append(i+1).append(":姓名 ").append(people.getName())
			.append(" 年龄 ").append(people.getAge()).append(" 性别 ")
			.append(people.getSex()).append(" 备注 ").append(people.getDemo());
			System.out.println(sb.toString());
		}
		
		/**
		 * dom4j解析
		 */
		public static void dom()
		{
			try 
			{
				//people集合
				List<People> userList = new ArrayList<People>(16);
				//people对象
				People people = null;
				
				File xml = new File("D:/新的开始/学习笔记/java学习/xml解析/test-b.xml");
				SAXParserFactory factory = SAXParserFactory.newInstance();
				SAXParser parser = factory.newSAXParser();
				
				//调用自定义Handler处理xml文档
				parser.parse(xml, new MySAXHandlerB(userList));
				
				//控制台输出
				for (int i = 0; i< userList.size(); i++)
				{
					people = userList.get(i);
					print(i,people);
				}
				
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		/**
		 * @param args
		 */
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			
			dom();
			
		}

	}

 5 执行SaxB对象的main方法,输出如下:

1:姓名 sky 年龄 25 性别 男 备注 人皇
	2:姓名 fly 年龄 23 性别 男 备注 中国小兽皇
	3:姓名 小仓美眉 年龄 20 性别 女 备注 魔兽女子第一人
	4:姓名 doudou 年龄 20 性别 女 备注 美女主持啊
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics