1首先是XMl文档
<?xml version="1.0" encoding="UTF-8"?>
<cve xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://cve.mitre.org/cve/downloads"
xsi:noNamespaceSchemaLocation="http://cve.mitre.org/schema/cve/cve_1.0.xsd">
<item type="CVE" name="CVE-1999-0002" seq="1999-0002">
<status>Entry</status>
<desc>Buffer overflow in NFS mountd gives root access to remote attackers, mostly in Linux systems.</desc>
<refs>
<ref source="SGI" url="ftp://patches.sgi.com/support/free/security/advisories/19981006-01-I">19981006-01-I</ref>
<ref source="CERT">CA-98.12.mountd</ref>
<ref source="CIAC" url="http://www.ciac.org/ciac/bulletins/j-006.shtml">J-006</ref>
<ref source="BID" url="http://www.securityfocus.com/bid/121">121</ref>
<ref source="XF">linux-mountd-bo</ref>
</refs>
</item>
</cve>
2具体的解析类:
package com.test;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import com.bean.Item;
import com.bean.Ref;
public class StaxTest {
//基于事件流的方式来做的,通过使用流的API,像指针一样的来处理文档,每一个节点都可以返回一个事件。处理完以后由JVM来回收内存。
public static void main(String[] args) throws IOException,
XMLStreamException {
StaxTest test = new StaxTest();
File file = new File("src/test.xml");
test.read(file);
}
public void read(File file) throws IOException, XMLStreamException {
Long time = null;
XMLInputFactory factory = XMLInputFactory.newInstance();
Reader fileReader = new FileReader(file);
factory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
XMLStreamReader reader = factory.createXMLStreamReader(fileReader);
try {
int event = reader.getEventType();//获取节点类型,结果是以整形的方式返回的。
//这里的3个对象是具体的POJO
Item item = null;
Ref ref = null;
List<Ref> refList = null;//用来存放POJO的集合
while (true) {
switch (event) {
case XMLStreamConstants.START_DOCUMENT://表示的是文档的开通节点。
time = System.currentTimeMillis();
break;
case XMLStreamConstants.START_ELEMENT://开始解析开始节点
if (reader.getLocalName().equals("item")) {//判断节点的名字
item = new Item();//实例化一个节点POJO类
refList = new ArrayList<Ref>();
//给节点赋值
item.setType(reader.getAttributeValue(0));//getAttributeValue(index)获取属性的值,可能有多个属性。
item.setName(reader.getAttributeValue(1));
item.setSeq(reader.getAttributeValue(2));
}
if (reader.getLocalName().equals("status")) {
item.setStatus(reader.getElementText());
}
if (reader.getLocalName().equals("desc")) {
item.setDesc(reader.getElementText());
}
if (reader.getLocalName().equals("ref")) {
ref = new Ref();
ref.setSource(reader.getAttributeValue(0));
if (reader.getAttributeCount() > 2) {
ref.setUrl(reader.getAttributeValue(1));
}
ref.setText(reader.getElementText());
System.out.println("-----------refs--ref-------------");
if (reader.getAttributeCount() > 2) {
System.out.println("url: "
+ reader.getAttributeValue(1));
}
}
break;
case XMLStreamConstants.CHARACTERS:
// if(reader.isWhiteSpace())
// break;
break;
//文档的结束元素
case XMLStreamConstants.END_ELEMENT:
if (reader.getLocalName().equals("item")) {
item.setRefList(refList);
}
break;
//文档的结束。
case XMLStreamConstants.END_DOCUMENT:
System.out.println("-----------end Document--------");
time = System.currentTimeMillis() - time;
System.out.println("耗时: " + time + "毫秒");
break;
}
if (!reader.hasNext()) {
break;
}
event = reader.next();
}
} finally {
reader.close();
}
}
}
3使用的其它类POJO
public class Item implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String type;
private String name;
private String seq;
private String status;
private String desc;
private List<Ref> refList = new ArrayList<Ref>();
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
..................................
private static final long serialVersionUID = 1L;
private String source;
private String url;
private String text;
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
............................
4 使用的jar 包 stax-1.2.0.jar
stax-api-1.0.1.jar