有没有办法获得xml文件中的第一个标记,并使用sax解析器确保它有相应的结束标记?
只需处理endDocument,如果调用了它,那么它就是格式良好的。
这听起来更像是您想要使用DOM解析。
如果您使用sax解析,实际上是在说您不想一次处理(在内存中加载)整个文档。如果您搜索第一个标记end(根标记),您将同时扫描整个文档,从而失去SAX的好处。
当您加载文档并且文档格式不正确时,DOM解析也会抛出。因此,无需手动检查根标记是否已关闭。
您可以处理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
}
}
}
SAX解析器实际上在任何标记未打开或关闭时抛出异常,因此不需要处理它。。。。因此,如果XML文件错误/损坏,SAX解析器将抛出异常