获取第一个标签Sax解析器

时间:2012-07-24 15:08:48

标签: java xml xml-parsing sax saxparser

有没有办法在xml文件中获取第一个标记,并确保它使用sax解析器具有相应的结束标记?

4 个答案:

答案 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解析器将抛出异常