java xml 标签,java – 使用SAX解析器,如何解析具有相同名称标签但在不同元素中的xml文件?...

好吧,我在Java中没有使用过多年的SAX,所以这是我对它的看法:

package play.xml.sax;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import java.util.Stack;

public class Test1 {

public static void main(String[] args) {

SAXParserFactory spf = SAXParserFactory.newInstance();

SchoolsHandler handler = new SchoolsHandler();

try {

SAXParser sp = spf.newSAXParser();

sp.parse("schools.xml", handler);

System.out.println("Number of read schools: " + handler.getSchools().size());

} catch (SAXException se) {

se.printStackTrace();

} catch (ParserConfigurationException pce) {

pce.printStackTrace();

} catch (IOException ie) {

ie.printStackTrace();

}

}

}

class SchoolsHandler extends DefaultHandler {

private static final String TAG_SCHOOLS = "Schools";

private static final String TAG_SCHOOL = "School";

private static final String TAG_STUDENT = "Student";

private static final String TAG_ID = "ID";

private static final String TAG_NAME = "Name";

private final Stack tagsStack = new Stack();

private final StringBuilder tempVal = new StringBuilder();

private List schools;

private School school;

private Student student;

public void startElement(String uri, String localName, String qName, Attributes attributes) {

pushTag(qName);

tempVal.setLength(0);

if (TAG_SCHOOLS.equalsIgnoreCase(qName)) {

schools = new ArrayList();

} else if (TAG_SCHOOL.equalsIgnoreCase(qName)) {

school = new School();

} else if (TAG_STUDENT.equalsIgnoreCase(qName)) {

student = new Student();

}

}

public void characters(char ch[], int start, int length) {

tempVal.append(ch, start, length);

}

public void endElement(String uri, String localName, String qName) {

String tag = peekTag();

if (!qName.equals(tag)) {

throw new InternalError();

}

popTag();

String parentTag = peekTag();

if (TAG_ID.equalsIgnoreCase(tag)) {

int id = Integer.valueOf(tempVal.toString().trim());

if (TAG_STUDENT.equalsIgnoreCase(parentTag)) {

student.setId(id);

} else if (TAG_SCHOOL.equalsIgnoreCase(parentTag)) {

school.setId(id);

}

} else if (TAG_NAME.equalsIgnoreCase(tag)) {

String name = tempVal.toString().trim();

if (TAG_STUDENT.equalsIgnoreCase(parentTag)) {

student.setName(name);

} else if (TAG_SCHOOL.equalsIgnoreCase(parentTag)) {

school.setName(name);

}

} else if (TAG_STUDENT.equalsIgnoreCase(tag)) {

school.addStudent(student);

} else if (TAG_SCHOOL.equalsIgnoreCase(tag)) {

schools.add(school);

}

}

public void startDocument() {

pushTag("");

}

public List getSchools() {

return schools;

}

private void pushTag(String tag) {

tagsStack.push(tag);

}

private String popTag() {

return tagsStack.pop();

}

private String peekTag() {

return tagsStack.peek();

}

}

class School {

private int id;

private String name;

private List students = new ArrayList();

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public void addStudent(Student student) {

students.add(student);

}

public List getStudents() {

return students;

}

}

class Student {

private int id;

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

}

schools.xml包含您的示例XML.请注意,我把所有内容都塞进了一个文件中,但这只是因为我只是在玩耍.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值