【问题标题】:Get first tag Sax parser获取第一个标签 Sax 解析器
【发布时间】:2012-07-22 22:42:46
【问题描述】:

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

【问题讨论】:

    标签: java xml xml-parsing sax saxparser


    【解决方案1】:

    只需处理 endDocument,如果调用了它则格式正确。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我在想 dom 现在会更合适....但是改变它的努力太多了,因为我有 sax 解析器做的这么多.... endDocument( ) 跑步?是文档实际结束还是读取第一个标签的结束标签?
      • 我无法向您保证 SAX for Java 的工作原理,我只在其他语言中使用 SAX,在 Java 中使用 DOM。但是我认为应该在根标签关闭时触发 endDocument 。当您到达文件末尾时不会。
      • 是的,你的权利,如果结束标签不存在,它会抛出异常
      【解决方案3】:

      您可以处理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
               }
           }
      }
      

      【讨论】:

      • 是的,但我不知道起始元素,因为它可以是一百个中的一个......但我需要知道 xml 文件中的第一个元素打开和关闭
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-11-09
        • 1970-01-01
        • 2012-05-09
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 2015-09-29
        • 2011-02-19
        • 2012-07-16
        相关资源
        最近更新 更多