读书人

sax解析xml范例一

发布时间: 2012-09-07 10:38:15 作者: rapoo

sax解析xml实例一

?解析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 blocke.printStackTrace();}}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubdom();}}

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

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

读书人网 >XML SOAP

热点推荐