栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

最快,最优化的方式读取xml

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

最快,最优化的方式读取xml

如果性能对您而言很重要,则应首选SAX或StAX(http://en.wikipedia.org/wiki/StAX)而不是DOM。

使用时

DOM
,第一次将
XML
文件解析为对象模型,然后您可以提出要求。因此,对您而言,算法有两遍。

使用时SAX,在解析过程中,某些基于事件或推送模型的回调将被调用(

startdocument,endElement...
) 。
SAX

使用StAX,您可以控制解析。您将光标从一个元素移动到另一个。这是拉模型。

对于包含32910000人的文件,我将我的版本与SAX的(Blaise Doughan的)过度回答进行了比较StAX。我删除了所有System.out.println指示。我的程序花了106秒读取所有文件,另一个花了94秒。我想这SAX是较慢的,因为callback即使它们都不执行任何操作都将被调用(push模型),而使用StAX时,光标仅在“ interresting”元素(pull模型)上移动。

例如,使用Java 7:

import java.io.File;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class ReadAndPrintXMLFileWithSax {    public static void main(String[] args) throws Exception {        SAXParserFactory fabrique = SAXParserFactory.newInstance();        SAXParser parser = fabrique.newSAXParser();        File file = new File("book.xml");        BookHandler handler = new BookHandler();        parser.parse(file, handler);    }    public static class BookHandler extends DefaultHandler {        private int count = 0;        private StringBuilder buffer;        @Override        public void startElement(String uri, String localName, String qName,     Attributes attributes) throws SAXException { switch (qName) { case "person":     count++;     break; case "first":     buffer = new StringBuilder("First Name : ");     break; case "last":     buffer = new StringBuilder("Last Name : ");     break; case "age":     buffer = new StringBuilder("Age : ");     break; }        }        @Override        public void characters(char[] ch, int start, int length)     throws SAXException { String content = new String(ch, start, length); if (buffer != null)     buffer.append(content);        }        @Override        public void endElement(String uri, String localName, String qName)     throws SAXException { switch (qName) { case "first": case "last": case "age":     System.out.println(buffer.toString());     break; }        }        @Override        public void enddocument() throws SAXException { System.out.println(count + " persons");        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451513.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号