0

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

4

4 回答 4

1

这听起来更像是您想使用 DOM 解析。

如果您使用 sax 解析,您实际上是在说您不想一次处理(加载到内存中)整个文档。如果您搜索第一个标签 end(根标签),您将一次扫描整个文档,并失去 SAX 的优势。

当您加载文档并且它的格式不正确时,DOM 解析也会抛出。因此无需手动检查根标签是否关闭。

于 2012-07-24T15:14:37.867 回答
1

只需处理 endDocument,如果调用它,那么它的格式是正确的。

于 2012-07-24T15:10:41.813 回答
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
         }
     }
}
于 2012-07-24T15:11:40.803 回答
0

如果任何标签未打开或关闭,SAX 解析器实际上会引发异常,因此不需要对其进行处理....因此,如果 XML 文件错误/损坏,SAX 解析器将抛出异常

于 2012-07-24T15:33:04.403 回答