基于Woodstox的StAX 2 解析XML

[size=small]StAX (Streaming API for XML)面向流的拉式解析XML,速度快、占用资源少,非常合适处理大数据量的xml文件。

详细教程和说明可以参见以下几篇文章:

使用 StAX 解析 XML,第 1 部分: Streaming API for XML (StAX) 简介
[url]http://www.ibm.com/developerworks/cn/xml/x-stax1.html[/url]

使用 StAX 解析 XML,第 2 部分: 拉式解析和事件
[url]http://www.ibm.com/developerworks/cn/xml/x-stax2.html[/url]

使用 StAX 解析 XML,第 3 部分: 使用定制事件和编写 XML
[url]http://www.ibm.com/developerworks/cn/xml/x-stax3.html[/url]

Java6.0新特性之StAX--全面解析Java XML分析技术
[url]http://zangweiren.iteye.com/blog/647334[/url]

Geronimo 叛逆者: 使用集成软件包:Codehaus 的 Woodstox
[url]http://www.ibm.com/developerworks/cn/opensource/os-ag-renegade15/[/url]

本文的目的是说明Woodstox包中的StAX2应用。
Woodstox官网[url]http://woodstox.codehaus.org/[/url]

下载woodstox-core.jar,核心包有两种开源协议apache的ASL和流行的LGPL,同时woodstox-core.jar需要stax2-api.jar的支持

stax2和stax有些不同,且对原来stax的代码不兼容

[b]读取操作:[/b][/size]

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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值