stax解析XML的一个例子

本文介绍了一个基于Java StAX API实现的XML文件解析示例,详细展示了如何读取并解析CVE漏洞描述XML文件,提取关键信息到POJO对象中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值