有没有办法在xml文件中获取第一个标记,并确保它使用sax解析器具有相应的结束标记?
答案 0 :(得分:1)
只需处理endDocument,如果调用它,那么它就会很好地形成。
答案 1 :(得分:1)
您可以处理startElement()
,endElement()
和endDocument()
,也可以只处理endDocument()
。如果文档格式不正确,endDocument()
应该抛出异常。但是,为了学习,我将展示一些例子:
public class MyParser extends DefaultHandler {
private String firstElement;
private String lastElement;
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if(firstElement == null) {
firstElement = name;
}
}
public void endElement(String uri, String localName, String name) throws SAXException {
lastElement = name;
}
public void endDocument() {
if(lastElement.equals(firstElement)) {
// Well formed input
}
}
}
您还可以确保使用堆栈关闭所有元素:
public class MyParser extends DefaultHandler {
Stack<String> stk;
//...
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
stk.push(name);
}
public void endElement(String uri, String localName, String name) throws SAXException {
if(stk.pop().equals(name)) {
// Input is well formed for each tag
}
else {
// Not well-formed
}
}
}
答案 2 :(得分:1)
这听起来更像是你想要使用DOM解析。
如果您使用sax解析,实际上您说您不想立即处理(在内存中加载)整个文档。如果您搜索第一个标签end(根标签),您将立即扫描整个文档,并失去SAX的好处。
当您加载文档时,DOM解析也会抛出,而且格式不正确。因此,无需手动检查根标签是否已关闭。
答案 3 :(得分:0)
如果任何标记未打开或关闭,SAX解析器实际上会抛出异常,因此不需要处理它....所以如果XML文件错误/损坏,SAX解析器将抛出异常