使用SAX解析器解析大型XML文件(跳过一些行/标签)

问题描述:

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

+0

我想延长VTD-XML允许您在一个内存有效的方式或随机访问,远胜于SAX的Apache沼气池 – 2011-03-02 03:01:40

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

+0

Thaks很大的出入XML,你的答案会来救我的长代码行! – Amine 2010-08-05 19:32:30

您可以尝试使用将在场景后使用SAX来解析xml的XPath。这里的缺点是XML将在每次调用Xpath评估方法时被解析。

+0

感谢您的回复,我会研究这种可能性! – Amine 2010-08-05 19:33:47

你要读取特定的标签,然后DOM解析器比SAX解析器parser..SAX快很多,如果你想大解析XML文件是非常有用的..

+0

SAX解析比DOM快得多。 DOM还要求将整个文档带入内存。 – 2010-08-05 15:07:58

+0

非常感谢您的回答,我非常感谢您的帮助,我将尝试使用DOM并查看我得到的输出结果。 – Amine 2010-08-05 19:35:43

是的,你可以做到这一点,只是忽略标签你不感兴趣。但是注意,整个文件将被解析为这个(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. 
} 
+0

谢谢,这正是我通常这样做;)! – Amine 2010-08-05 19:36:06

您可以尝试为获取有趣的部分创建一个解析的XML文档和XPath TagSoup组合。

+0

感谢DaDaDom为你的答案我会尽快研究! – Amine 2010-08-05 19:36:47

+0

可悲的是使用xpath不是那么容易在android – Janusz 2010-10-05 15:06:26

见我的回答对使用SAX跳过的策略类似的问题/忽略标签:

Skipping nodes with sax

它涉及XMLReader可以切换ContentHandlers。当您阅读移植XML文档时,您只需交换一个与事件无关的ContentHandler即可。当要被忽略的部分结束时,它将控制权交还给用于处理XML内容的内容处理程序。

+0

你的答案肯定有助于实现我的目标!非常感谢 -Cheers – Amine 2010-08-05 19:37:26

我喜欢普通消化器。它允许您指定针对特定标签的规则。规则只有在遇到标签时才会执行。

消化器建立在萨克斯之上,因此具有所有萨克斯特征以及选择性解析特定标签所需的特异性。它还使用了一个堆栈,当遇到相应的标记时,它会使用新元素推送,并在元素结束时弹出。

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

退房沼气池在http://commons.apache.org/digester/

+0

非常感谢Raja,我会研究这个解决方案! – Amine 2010-08-05 19:38:48