我目前正在开发一个使用 SAX 从 Internet 检索数据的应用程序。我以前用它来解析简单的 XML 文件,比如 Google Weather API。但是,我感兴趣的网站将解析提升到一个新的水平。页面很大,看起来很乱。我只需要检索一些特定的行;其余的对我没有用。
是否可以跳过那些无用的行/标签,还是我必须一步一步来?
7 回答
我喜欢公共消化器。它允许您针对特定标签指定规则。该规则仅在遇到标记时执行。
Digester 建立在 sax 之上,因此具有所有 sax 功能以及选择性解析特定标签所需的特异性。它还使用一个堆栈,当遇到相应的标签时,它会与新元素一起被推送,并在元素结束时弹出。
我用它来解析我的所有配置文件。
是的,您可以这样做,只需忽略您不感兴趣的标签。但请注意,必须为此解析整个文档(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.
}
是的,你可以跳过。只需定义您想要的那些标签,它只会获取那些标签值。
您可以尝试使用 XPath,它将在后台使用 SAX 来解析您的 xml。这里的缺点是每次调用 Xpath 评估方法时都会解析 XML。
如果你想读取特定的标签,那么 DOM 解析器比 SAX 解析器快得多。如果你想解析大型 XML 文件,SAX 解析器很有用。
您可以尝试结合使用TagSoup来创建可解析的 XML 文档和 XPath 来获取有趣的部分。
有关使用 SAX 跳过/忽略标签的策略,请参阅我对类似问题的回答:
它涉及在 XMLReader 上切换 ContentHandler。当您阅读要跳过的 XML 文档的移植时,您只需换入对事件不执行任何操作的 ContentHandler。当到达要忽略的部分的末尾时,它会将控制权传递回您用来处理 XML 内容的内容处理程序。