【问题标题】:Parsing big XML files using SAX parser (skip some lines/tags)使用 SAX 解析器解析大型 XML 文件(跳过一些行/标签)
【发布时间】:2011-03-25 14:47:30
【问题描述】:

我目前正在开发一个使用 SAX 从 Internet 检索数据的应用程序。我以前用它来解析简单的 XML 文件,比如 Google Weather API。但是,我感兴趣的网站将解析提升到一个新的水平。页面很大,看起来很乱。我只需要检索一些特定的行;其余的对我没用。
是否可以跳过那些无用的行/标签,还是我必须一步一步去?

【问题讨论】:

  • 我认为扩展的 vtd-xml 允许您以内存高效的方式随机访问 xml,比 SAX 或 apache 消化器好得多

标签: java android xml saxparser


【解决方案1】:

是的,您可以跳过。只需定义您想要的那些标签,它只会获取那些标签值。

【讨论】:

    【解决方案2】:

    您可以尝试使用 XPath,它将在后台使用 SAX 来解析您的 xml。这里的缺点是每次调用 Xpath 评估方法都会解析 XML。

    【讨论】:

    • 感谢您的回复,我会调查这种可能性!
    【解决方案3】:

    如果您想读取特定标签,那么 DOM 解析器比 SAX 解析器快得多。如果您想解析大型 XML 文件,SAX 解析器很有用..

    【讨论】:

    • SAX 解析比 DOM 快得多。 DOM 还要求将整个文档放入内存中。
    • 非常感谢您的回答,非常感谢您的帮助,我会尝试使用 DOM 并查看我得到的输出!
    【解决方案4】:

    是的,您可以这样做,只需忽略您不感兴趣的标签。但请注意,必须为此解析整个文档(DefaultHandler impl)

    public startElement(String uri, String localName, 
         String qName, Attributes attributes)  {
      if(localName.equals("myInterestingTag") {
         // do your thing....
      }
    }
    
    public void endElement(String uri, String localName, String qName) {
      if(localName.equals("myInterestingTag") {
         // do your thing....
      }
    }
    
    public void characters(char[] ch, int start, int length) {
      // if parsing myinteresting tag... do some stuff.
    }
    

    【讨论】:

    • 谢谢,这正是我通常的做法;)!
    【解决方案5】:

    您可以尝试结合使用 TagSoup 创建可解析的 XML 文档和 XPath 来获取感兴趣的部分。

    【讨论】:

    • 遗憾的是,在 android 上使用 xpath 并不容易
    【解决方案6】:

    有关使用 SAX 跳过/忽略标签的策略,请参阅我对类似问题的回答:

    Skipping nodes with sax

    它涉及在 XMLReader 上切换 ContentHandler。当您阅读要跳过的 XML 文档的移植时,您只需换入一个对事件不做任何事情的 ContentHandler。当到达要忽略的部分的末尾时,它将控制权交还给您用来处理 XML 内容的内容处理程序。

    【讨论】:

    • 您的回答一定会帮助我实现目标!非常感谢-干杯
    【解决方案7】:

    我喜欢公共消化器。它允许您针对特定标签指定规则。该规则仅在遇到标记时执行。

    Digester 基于 sax 构建,因此具有所有 sax 功能以及选择性解析特定标签所需的特异性。它还使用一个堆栈,当遇到相应的标签时,它会与新元素一起推送,并在元素结束时弹出。

    我用它来解析我的所有配置文件。

    通过http://commons.apache.org/digester/查看消化器

    【讨论】:

    • 非常感谢 Raja,我会研究这个解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2013-01-08
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多