【发布时间】:2011-11-04 19:32:12
【问题描述】:
是否可以在 SAX 解析器中给出路径表达式?我有一个 XML 文件,它有几个相同的名称标签,但它们在不同的元素中。有什么方法可以区分它们。 这是 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 区分开来。
感谢您的回复:
我创建了一个学生 pojo,它具有以下字段 - school_id、school_name、student_id 和 student_name 以及它们的 getter 和 setter 方法。这是我的临时解析器实现。当我解析 xml 时,我需要将学校名称、id、学生姓名、id 的值放入 pojo 中并返回。你能告诉我我应该如何实现差异化堆栈。这是我的解析器框架::
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);
}
}
【问题讨论】:
-
另请查看:stackoverflow.com/questions/1863250 - 有些项目允许您将 XPath 的子集与流式文档一起使用。如果您可以将您的问题放入该子集中,则生成的代码将比任何手动 SAX 处理程序代码更可取。
-
带上下文的 SAX 解析就像一个状态机:en.wikipedia.org/wiki/Finite-state_machine,你需要有一些可以打开/关闭的标志来知道你在哪里,但它很快就会变得非常混乱,你在你走得太远之前应该考虑替代方案。
标签: java xml xpath xml-parsing saxparser