您的位置:首页 > 编程语言 > Java开发

java学习第二阶段day7

2016-01-02 00:00 681 查看
摘要: .xml文件解析(sax pull)

.xml文件解析(sax pull)

sax 解析

//1、创建一个学生类 继承DefaultHandler类
//然后重写startDocument endDocument startElement endElement characters 方法
//2、在解析.xml文件时 先 进入xml文档重写的方法startDocument
//3、然后进入开始标记startElement
//4、在进入标记之间的内容方法里 characters
//5、在进入结束标记方法里 endElement
//6、最后 进入结束xml的文档标志方法里 endDocument

学生类

public class Student {
public String name;
public int age;
public int id;
public String toString() {
return "Student [name=" + name + ", age=" + age + ", id=" + id + "]";
}
}

-----------------

StudentHandler 类

public class StudentHandler extends DefaultHandler {
private String tag;//保存标记名
private Student stu;
private List<Student> list;
//
public List<Student> getlist(){
return list;
}
public void startDocument() throws SAXException {
list = new ArrayList<Student>();
}

public void endDocument() throws SAXException {
}
//开始的标记
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tag = qName;
if("student".equals(tag)){
stu = new Student();
//如果开始标记 有 属性
for(int i = 0;i<attributes.getLength();i++){
//获取开始标记 里的 属性标记
String q_name = attributes.getQName(i);
//获取 开始标记里的 属性标记 的内容
String content = attributes.getValue(i);
if("id".equals(q_name)){
stu.id = Integer.parseInt(content);
}else if("name".equals(q_name)){
stu.name = content;
}else if("age".equals(q_name)){
stu.age = Integer.parseInt(content);
}

}
}
}
//结束标记
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("student".equals(qName)){
list.add(stu);
}
tag = "";
}
//标记之间的内容
public void characters(char[] ch, int start, int length)
throws SAXException {
String str = new String(ch,start,length);
if("id".equals(tag)){
stu.id = Integer.parseInt(str);
}else if("name".equals(tag)){
stu.name = str;
}else if("age".equals(tag)){
stu.age = Integer.parseInt(str);
}
}

}

---------------------
测试类 SaxXml

public class SaxXml {
public static void main(String[] args) throws Exception {
//得到解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//通过工厂获得解析器
SAXParser parser = factory.newSAXParser();
StudentHandler handler = new StudentHandler();
//将文件 和 studenthandler 和 解析器 相关联
parser.parse("d:\\Student2.xml", handler);
//需要得到解析的集合
List<Student> list = handler.getlist();
for(Student s : list){
System.out.println(s);
}
}
}
-----------------------------------------------------------------------------

pull 解析

Student2 类

public class Student2 {

public String name;
public int age;
public int id;
@Override
public String toString() {
return "Student2 [name=" + name + ", age=" + age + ", id=" + id + "]";
}

}

------------
pullxml 类

public class PullXml {
public static void main(String[] args) {
//pull 解析 xml 文件
//需要导入 第三方包 kxml
//1、创建一个student 类
XmlPullParserFactory factory;
try {
//创建一个解析工厂
factory = XmlPullParserFactory.newInstance();
//从 解析工厂 获得解析器
XmlPullParser parser = factory.newPullParser();
//设置 要解析.xml文件 的路径
parser.setInput(new FileInputStream("d:\\student.xml"),"utf-8");
//获取 事件类型
//事件类型有START_DOCUMENT(xml文件开始标记)
//START_TAG(xml开始标记)
//END_DOCUMENT(xml文件结束标记) END_TAG(xml结束标记)
int type = parser.getEventType();
//用while循环 如果 不是 xml文件结束标记 就一直 在里面循环
String tag;
List<Student2> list = null;
Student2 stu = null;
while(type != XmlPullParser.START_DOCUMENT){
//获取标记 名字
tag = parser.getName();
switch(type){
case XmlPullParser.START_TAG:
//如果开始标记 是student 就new 一个学生 对象
if("student".equals(tag)){
stu = new Student2();
//如果 开始标记 里面也有 标记 属性
for(int i = 0;i<parser.getAttributeCount();i++){
//获取开始标记 里面的 标记属性 名字
String attribute_name = parser.getAttributeName(i);
//获取开始标记 里面的标记属性 值
String attribute_value = parser.getAttributeValue(i);
if("id".equals(attribute_name)){
stu.id = Integer.parseInt(attribute_value)
}else if("name".equals(attribute_name)){
stu.name = attribute_value;
}else if("age".equals(attribute_name)){
stu.age = Integer.parseInt(attribute_value);
}
}
//----------------------------------------------
}else if("name".equals(tag)){
stu.name = parser.nextText();
//把整数 转换为字符串
}else if("id".equals(tag)){
stu.id = Integer.parseInt(parser.nextText());
}else if("age".equals(tag)){
stu.age = Integer.parseInt(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
//如果结束标记 为student 就把 对象 添加到集合里
if("student".equals(tag)){
list.add(stu);
}
break;
default:
}
//跳到下一个 常量 得到事件常量
type = parser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息