`
chenhua_1984
  • 浏览: 1251203 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

stax解析XML的一个例子

    博客分类:
  • java
阅读更多

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

 

分享到:
评论
2 楼 ivanf8e62 2013-11-25  
aa00aa00 写道
用过jdom,dom4j和sax,感觉SAX方式是最快的,呵呵,你的这种方式没有用过,感觉和SAX差不多吧,呵呵!!


并发量小看不出来, 但是并发大一点下,你就知道SAX慢得跟什么似的了。 我做了50000请求量, 并发线程200条(CycilcBarrier 同步推 200线程并发请求),  随便怎么压测, 用SAX解析的TPS 比 STAX少了2倍不止。 虽然STAX写解析代码麻烦点,但是速度快的。
1 楼 aa00aa00 2011-12-30  
用过jdom,dom4j和sax,感觉SAX方式是最快的,呵呵,你的这种方式没有用过,感觉和SAX差不多吧,呵呵!!

相关推荐

    用Stax组装及解析XML

    使用StAX解析XML文档则需要借助`XMLInputFactory`和`XMLStreamReader`类完成。下面是一个简单的例子: ```java XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory....

    Stax组装及解析XML的例子

    Axis2在性能上的提升也得益于采用StAX解析XML。 总之,StAX提供了一种高效、低内存开销的方式来处理XML,尤其适用于处理大型XML文档和需要高性能的应用场景。通过组装和解析XML,开发人员可以灵活地在应用程序之间...

    解析XML文件例子

    以下是一些关于解析XML文件的知识点: 1. XML结构: - 根元素:XML文档必须有一个根元素,所有其他元素都包含在这个根元素内。 - 元素:XML中的基本单位,用尖括号 `&lt; &gt;` 包围,如 `&lt;book&gt;`。 - 属性:元素可以...

    java解析xml例子

    以下是一个使用StAX解析XML的例子: ```java import java.io.FileInputStream; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader;...

    java解析xml文件的例子(三中方式的都有,很全)

    DOM4J是一个Java库,提供了一个灵活且强大的API来处理XML,包括DOM、SAX和StAX的集成。相比DOM,DOM4J更易于使用,支持XPath查询。 - 引入DOM4J库,如`dom4j-1.6.1.jar`。 - 使用`DocumentHelper`类的`parseText()`...

    Sax解析xml及例子

    以下是一个简单的SAX解析XML的例子: ```java import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxExample extends DefaultHandler {...

    xml解析器,xml解析代码例子

    1. DOM解析器:它将整个XML文档加载到内存中,形成一个树形结构,称为DOM树。这样做的好处是可以方便地遍历和修改整个文档,但缺点是如果XML文档较大,可能会消耗大量内存。以下是一个简单的Java DOM解析示例: ```...

    JAVA调用webservice并解析xml

    这个例子中的"soap2"可能是项目中的一个具体示例,它可能包含了一个完成上述步骤的Java类或测试用例。测试成功并能在多个IDE中运行,意味着代码具有较好的兼容性和可靠性。 总结,调用Java中的Web服务并解析XML涉及...

    Java6.0新特性之StAX--全面解析Java XML分析技术

    在StAX中,解析XML文档有两种主要的角色:XMLStreamReader(用于读取)和XMLStreamWriter(用于写入)。XMLStreamReader允许开发者按需逐事件地读取XML,而XMLStreamWriter则可以逐事件地构造XML文档。这样,开发者...

    java在线解析xml

    1. DOM解析器:DOM是W3C推荐的一种解析XML的标准方式,它将整个XML文档加载到内存中形成一个树形结构,称为DOM树。通过DOM解析器,开发者可以轻松地遍历整个文档,访问任何元素或属性。优点是可以任意位置访问,但...

    xml解析例子得到各个节点信息

    DOM(文档对象模型)解析器将整个XML文档加载到内存中,形成一个树形结构,方便通过节点遍历获取信息。例如,使用Java的`javax.xml.parsers.DocumentBuilderFactory`和`DocumentBuilder`类可以创建DOM解析器,然后...

    详 解Java解析XML

    以下是一个简单的DOM解析XML的例子: ```java import javax.xml.parsers.*; import org.w3c.dom.*; import java.io.*; public class DOMExample { public static void main(String[] args) { try { ...

    java dom4j解析xml

    - 以下是一个简单的DOM4J解析XML的例子: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; public class Dom4jExample { public static void main(String...

    xmappr解析XML适用例子

    相比于传统的DOM、SAX或StAX解析器,xmappr通过其直观的API降低了XML处理的复杂性,提高了开发效率。 首先,要使用xmappr,你需要在你的项目中引入它的依赖。如果你的项目是Maven项目,可以在pom.xml文件中添加以下...

    xml数据前后台解析:jdom与dom4j源码,程序可以跑

    2. **DOM4J**:DOM4J是另一个流行的Java XML解析库,它不仅支持DOM,还支持SAX和StAX解析。DOM4J提供了更为灵活的API,可以方便地进行XML的读写操作。以下是一个使用DOM4J读取XML文档的例子: ```java ...

    dom4j 解析xml例子

    在这个“dom4j解析xml例子”中,我们将深入探讨DOM4J如何帮助开发者在Java环境中有效地处理XML数据。 首先,我们需要了解XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置...

    使用Pull解析器读取XML文件和生成XML文件

    这个例子生成了一个简单的XML文档:`&lt;root&gt;Hello, World!&lt;/root&gt;`。在实际应用中,可以根据需求递归地调用`startTag`、`endTag`和`text`方法来构建复杂的XML结构。 总的来说,使用Pull解析器读取和生成XML文件是一...

    xml解析 dom方式 例子和讲解

    总结来说,DOM解析XML是通过构建一个完整的XML文档对象模型,然后通过这个模型进行数据的读取和操作。这种方式适合处理较小的XML文件,因为整个文件会被加载到内存中,对于大文件可能会消耗大量资源。对于大型XML...

    java创建与解析xml的例子

    4. **StAX解析**:Streaming API for XML(StAX)是基于流的解析,允许应用程序以迭代方式处理XML事件。它比SAX更灵活,允许向前和向后导航,但不支持随机访问。 这个Web工程中的测试代码可能涵盖了这些解析方式的...

    Java使用sax、dom、dom4j解析xml文档

    以下是一个DOM4J解析XML的简单示例: ```java import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; public class Dom4jExample { public static void main(String[] args) {...

Global site tag (gtag.js) - Google Analytics