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