StAX (Streaming API for XML)面向流的拉式解析XML,速度快、占用资源少,非常合适处理大数据量的xml文件。
详细教程和说明可以参见以下几篇文章:
使用 StAX 解析 XML,第 1 部分: Streaming API for XML (StAX) 简介
http://www.ibm.com/developerworks/cn/xml/x-stax1.html
使用 StAX 解析 XML,第 2 部分: 拉式解析和事件
http://www.ibm.com/developerworks/cn/xml/x-stax2.html
使用 StAX 解析 XML,第 3 部分: 使用定制事件和编写 XML
http://www.ibm.com/developerworks/cn/xml/x-stax3.html
Java6.0新特性之StAX--全面解析Java XML分析技术
http://zangweiren.iteye.com/blog/647334
Geronimo 叛逆者: 使用集成软件包:Codehaus 的 Woodstox
http://www.ibm.com/developerworks/cn/opensource/os-ag-renegade15/
本文的目的是说明Woodstox包中的StAX2应用。
Woodstox官网http://woodstox.codehaus.org/
下载woodstox-core.jar,核心包有两种开源协议apache的ASL和流行的LGPL,同时woodstox-core.jar需要stax2-api.jar的支持
stax2和stax有些不同,且对原来stax的代码不兼容
读取操作:
- public XMLStreamReader2 getStreamReader(String xmlStr) throws XMLStreamException {
- XMLInputFactory2 xmlif = (XMLInputFactory2) XMLInputFactory2
- .newInstance();
- xmlif.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,
- Boolean.FALSE);
- xmlif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,
- Boolean.FALSE);
- xmlif.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
- xmlif.configureForSpeed();
- XMLStreamReader2 xmlr = (XMLStreamReader2) xmlif.createXMLStreamReader(new BufferedReader(new StringReader(xmlStr)));
- return xmlr;
- }
- public XMLStreamReader2 getStreamReader(InputStream is) throws XMLStreamException, IOException {
- XMLInputFactory2 xmlif = (XMLInputFactory2) XMLInputFactory2
- .newInstance();
- xmlif.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES,
- Boolean.FALSE);
- xmlif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES,
- Boolean.FALSE);
- xmlif.setProperty(XMLInputFactory.IS_COALESCING, Boolean.FALSE);
- xmlif.configureForSpeed();
- XMLStreamReader2 xmlr = (XMLStreamReader2) xmlif.createXMLStreamReader(new BufferedReader(new InputStreamReader(is, "UTF-8")));
- return xmlr;
- }
- XMLStreamReader2 xmlsr = null;
- try {
- xmlsr = this.getStreamReader(str);
- int eventType = xmlsr.getEventType();
- list = new ArrayList<OfcardMainclass>();
- // 包装大类数据
- OfcardMainclass classof = null;
- while (xmlsr.hasNext()) {
- eventType = xmlsr.next();
- switch (eventType) {
- case XMLEvent2.START_ELEMENT:
- String name = xmlsr.getName().getLocalPart();
- if (name.equals("aa"))
- String s1 = xmlsr.getElementText();
- if (name.equals("bb"))
- String s2 = xmlsr.getAttributeValue(null, "att"));
- break;
- case XMLEvent2.END_ELEMENT:
- if (xmlsr.getName().getLocalPart().equals(
- "aa"))
- break;
- }
- }
- } finally {
- if (xmlsr != null)
- xmlsr.close();
- }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)