获取第一个标签Sax解析器



有没有办法获得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解析器将抛出异常