jdk1.6——StAX解析xml

Demo:

/**
 * 2018年11月23日上午11:36:31
 */
package testStAX;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;

import javax.xml.stream.EventFilter;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.XMLEvent;
import javax.xml.stream.util.StreamReaderDelegate;

/**
 * @author XWF
 *
 */
public class TestStAX {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("========XMLStreamReader=======");
		readXmlByStreamReader();
		System.out.println();
		System.out.println("========XMLEventReader=======");
		readXmlByEventReader();
		System.out.println();
		System.out.println("========XMLEventReader+Filter=======");
		readXmlByEventReaderWithFilter();
		System.out.println();
		System.out.println("========XMLStreamReaderDelegate=======");
		readXmlByStreamReaderDelegate();
	}

	public static void readXmlByStreamReader() {
		try {
			XMLInputFactory f = XMLInputFactory.newInstance();
//			XMLInputFactory f = XMLInputFactory.newFactory();//效果同上
			XMLStreamReader r = f.createXMLStreamReader(new FileInputStream(new File("xmltest.xml")));
//			XMLStreamReader r = f.createXMLStreamReader(new FileReader("xmltest.xml"));
			while(r.hasNext()) {
				//r.getEventType()第一次是7,表示的是START_DOCUMENT;
				int type = r.next();//指针移到下一个标记(START_DOCUMENT后面的标记),然后返回EventType;
				//type的值此时等于r.getEventType();
				
//				//EventType
//				XMLStreamReader.ATTRIBUTE;//属性
//				XMLStreamReader.CDATA;//CDATA块
//				XMLStreamReader.CHARACTERS;//字符
//				XMLStreamReader.COMMENT;//注释
//				XMLStreamReader.DTD;//DTD
//				XMLStreamReader.END_DOCUMENT;//文档结尾
//				XMLStreamReader.END_ELEMENT;//元素结尾
//				XMLStreamReader.ENTITY_DECLARATION;//实体声明
//				XMLStreamReader.ENTITY_REFERENCE;//实体引用
//				XMLStreamReader.NAMESPACE;//命名空间
//				XMLStreamReader.NOTATION_DECLARATION;//标记声明
//				XMLStreamReader.PROCESSING_INSTRUCTION;//处理指令
//				XMLStreamReader.SPACE;//可忽略空格
//				XMLStreamReader.START_DOCUMENT;//文档开始
//				XMLStreamReader.START_ELEMENT;//元素开始
				
				switch(type) {
				case XMLStreamReader.START_ELEMENT:
					System.out.print("<"+r.getName());//getName包括namespace和localName
//					r.getElementText();//获得开始和结束标签之间的文本,不能嵌套标签
					int attrCount = r.getAttributeCount();
					for(int i=0;i<attrCount;i++) {
						System.out.print(" "+r.getAttributeName(i)+"=\""+r.getAttributeValue(i)+"\"");
					}
					System.out.print(">");
					break;
				case XMLStreamReader.CHARACTERS:
					System.out.print(r.getText());
					break;
				case XMLStreamReader.END_ELEMENT:
					System.out.print("</"+r.getName()+">");
					break;
				default:
					break;
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (FactoryConfigurationError e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
	}

	public static void readXmlByEventReader() {
		try {
			XMLInputFactory f = XMLInputFactory.newInstance();
			XMLEventReader r = f.createXMLEventReader(new FileInputStream(new File("xmltest.xml")));
			//有一个XMLStreamReader转XMLEventReader的方法f.createXMLEventReader(XMLStreamReader)
			while(r.hasNext()) {
				XMLEvent event = r.nextEvent();
				//r.getEventType()比XMLStreamReader少了SAPCE和CDATA
				if(event.isStartElement()) {
					System.out.print("<"+event.asStartElement().getName());
					Iterator<Attribute> attrit = event.asStartElement().getAttributes();
					while(attrit.hasNext()) {
						Attribute attr = attrit.next();
						System.out.print(" "+attr.getName()+"=\""+attr.getValue()+"\"");
					}
					System.out.print(">");
				}else if(event.isCharacters()) {
					System.out.print(event.asCharacters().getData());
				}else if(event.isEndElement()) {
					System.out.print("</"+event.asEndElement().getName()+">");
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (FactoryConfigurationError e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
	}
	
	public static void readXmlByEventReaderWithFilter() {//XMLStreamReader的StreamFilter类似功能
		try {
			XMLInputFactory f = XMLInputFactory.newFactory();
			XMLEventReader r = f.createXMLEventReader(new FileReader("xmltest.xml"));
			XMLEventReader filterReader = f.createFilteredReader(r, new EventFilter() {
				
				@Override
				public boolean accept(XMLEvent event) {
					if(event.isStartElement()) {
						String name = event.asStartElement().getName()+"";
						if("MyXml".equals(name)) {//只保留这个开始标签
							return true;
						}
					}
					return false;
				}
			});
			
			while(filterReader.hasNext()) {
				XMLEvent event = filterReader.nextEvent();
				if(event.isStartElement()) {
					System.out.print("<"+event.asStartElement().getName());
					Iterator<Attribute> attrit = event.asStartElement().getAttributes();
					while(attrit.hasNext()) {
						Attribute attr = attrit.next();
						System.out.print(" "+attr.getName()+"=\""+attr.getValue()+"\"");
					}
					System.out.print(">");
				}else if(event.isCharacters()) {
					System.out.print(event.asCharacters().getData());
				}else if(event.isEndElement()) {
					System.out.print("</"+event.asEndElement().getName()+">");
				}
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (FactoryConfigurationError e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
	}
	
	public static void readXmlByStreamReaderDelegate() {//EventReaderDelegate类似
		try {
			XMLInputFactory f = XMLInputFactory.newInstance();
			XMLStreamReader r = f.createXMLStreamReader(new FileReader("xmltest.xml"));
			XMLStreamReader rd = new StreamReaderDelegate(r) {
				@Override
				public int next() throws XMLStreamException {
					while(true) {//过滤的只剩start和end标签
						if(super.hasNext()) {
							int type = super.next();
							if(type == XMLStreamReader.START_ELEMENT) {
								return type;
							}else if(type == XMLStreamReader.END_ELEMENT){
								return type;
							}else {
								continue;
							}
						}else {//没有下一个返回文档结尾
							return XMLStreamReader.END_DOCUMENT;
						}
					}
				};
			};
			
			while(rd.hasNext()) {
				int type = rd.next();
				switch(type) {
				case XMLStreamReader.START_ELEMENT:
					System.out.print("<"+r.getName());
					int attrCount = r.getAttributeCount();
					for(int i=0;i<attrCount;i++) {
						System.out.print(" "+r.getAttributeName(i)+"=\""+r.getAttributeValue(i)+"\"");
					}
					System.out.print(">");
					break;
				case XMLStreamReader.CHARACTERS:
					System.out.print(r.getText());
					break;
				case XMLStreamReader.END_ELEMENT:
					System.out.print("</"+r.getName()+">");
					break;
				default:
					break;
				}
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (FactoryConfigurationError e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
	}
}

xml文件用的上篇文章生成的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyXml NAME="hello">
	<eLe>18</eLe>
	<xC>
		<name>chchch</name>
	</xC>
	<strs>hello</strs>
	<strs>Tom</strs>
	<strs>Jerry</strs>
</MyXml>

结果:

 

参考:https://www.cnblogs.com/lenve/p/4517988.html

http://zangweiren.iteye.com/blog/647334

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值