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>
结果: