问题描述
是否可以在 SAX 解析器中给出路径表达式?我有一个 XML 文件,它有几个相同的名称标签,但它们在不同的元素中.有什么方法可以区分它们.这是 XML:
Is it possible to give path expressions in SAX parser? I have an XML file which has a few same name tags, but they are in different element. Is there any way to differentiate between them. Here is the XML:
<Schools>
<School>
<ID>335823</ID>
<Name>Fairfax High School</Name>
<Student>
<ID>4195653</ID>
<Name>Will Turner</Name>
</Student>
<Student>
<ID>4195654</ID>
<Name>Bruce Paltrow</Name>
</Student>
<Student>
<ID>4195655</ID>
<Name>Santosh Gowswami</Name>
</Student>
</School>
<School>
<ID>335824</ID>
<Name>FallsChurch High School</Name>
<Student>
<ID>4153</ID>
<Name>John Singer</Name>
</Student>
<Student>
<ID>4154</ID>
<Name>Shane Warne</Name>
</Student>
<Student>
<ID>4155</ID>
<Name>Eddie Diaz</Name>
</Student>
</School>
</Schools>
我想将学生的姓名和 ID 与学校的名称和 ID 区分开来.
I want to differentiate between the Name and Id of a student from the name and ID of a school.
感谢您的回复:
我创建了一个学生 pojo,它具有以下字段 - school_id、school_name、student_id 和 student_name 以及它们的 getter 和 setter 方法.这是我的临时解析器实现.当我解析 xml 时,我需要将学校名称、id、学生姓名、id 的值放入 pojo 中并返回.你能告诉我我应该如何实现差异化堆栈.这是我的解析器框架::
I have created a student pojo which has the following fields- school_id,school_name, student_id and student_name and getter and setter methods for them. This is my temporary parser implementation. When i parse the xml, I need to put the values of school name, id , student name, id in the pojo and return it. Can you tell me on how I should implement the stack for the differentiation. This is my parser framework::
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class HandleXML extends DefaultHandler {
private student info;
private boolean school_id = false;
private boolean school_name = false;
private boolean student_id = false;
private boolean student_name = false;
private boolean student = false;
private boolean school = false;
public HandleXML(student record) {
super();
this.info = record;
school_id = false;
school_name = false;
student_id = false;
student_name = false;
student = false;
school = false;
}
@Override
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
if (qName.equalsIgnoreCase("student")) {
student = true;
}
if (qName.equalsIgnoreCase("school")) {
school_id = true;
}
if (qName.equalsIgnoreCase("school_id")) {
school_id = true;
}
if (qName.equalsIgnoreCase("student_id")) {
student_id = true;
}
if (qName.equalsIgnoreCase("school_name")) {
school_name = true;
}
if (qName.equalsIgnoreCase("student_name")) {
student_name = true;
}
}
@Override
public void endElement(String uri, String localName,
String qName)
throws SAXException {
}
@Override
public void characters(char ch[], int start, int length)
throws SAXException {
String data = new String(ch, start, length);
}
}
推荐答案
好吧,我已经很多年没有在 Java 中使用 SAX 了,所以这是我的看法:
Well, I haven't played in years with SAX in Java, so here's my take on it:
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<String> tagsStack = new Stack<String>();
private final StringBuilder tempVal = new StringBuilder();
private List<School> 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<School>();
} 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<School> 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<Student> students = new ArrayList<Student>();
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<Student> 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.请注意,我将所有内容都塞进了一个文件中,但这只是因为我只是在玩耍.
schools.xml
contains your example XML. Please note that I crammed everything in a single file, but this is only for I was just playing around.
这篇关于使用 SAX 解析器,如何解析具有相同名称标签但元素不同的 xml 文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!