最近在学习webservice时,发现很多框架,技术都在使用StAX作为底层XML解析工具,于是今天看了看资料,简单学习了下,在这里做个总结。
import java.io.InputStream; import java.io.OutputStream; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLOutputFactory; public class StAX_Frist { public void writeXMlByStream(OutputStream out){ XMLOutputFactory outFactor=XMLOutputFactory.newInstance();//写解析器工厂 ....... } public void readXmlByStream(InputStream in){ XMLInputFactory inFactory=XMLInputFactory.newInstance();//读解析器工厂 ....... }
import java.io.InputStream; import javax.xml.stream.XMLInputFactory;; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamReader; public class StAX_Frist { public void readXmlByStream(InputStream in){ XMLInputFactory inFactory=XMLInputFactory.newInstance();//读解析器工厂 try { XMLStreamReader reader=inFactory.createXMLStreamReader(in);//获取读解析器 while(reader.hasNext()){//reader.hasNext();说明文件未到结尾。 int eventId=reader.next(); switch (eventId) { case XMLStreamConstants.START_DOCUMENT: System.out.println("start docmuent"); break; case XMLStreamConstants.START_ELEMENT: System.out.println("<"+reader.getLocalName()+">"); for(int i=0;i<reader.getAttributeCount();i++){ System.out.println(reader.getAttributeLocalName(i)+"="+reader.getAttributeValue(i)); } break; case XMLStreamConstants.CHARACTERS: if(reader.isWhiteSpace()){ break; } System.out.println(reader.getText()); break; case XMLStreamConstants.END_ELEMENT: System.out.println("</"+reader.getLocalName()+">"); break; case XMLStreamConstants.END_DOCUMENT: System.out.println("end docmuent"); break; default: break; } } } catch (Exception e) { e.printStackTrace(); } }另外一种是较为高级的基于迭代器(Iterator)的 API ,它允许应用程序把 XML 作为一系列事件对象来处理,每个对象和应用程序交换 XML 结构的一部分。应用程序只需要确定解析事件的类型,将其转换成对应的具体类型,然后利用其方法获得属于该事件的信息。基于事件迭代器的方法具有一个基于指针的方法不具备的重要优点。通过将解析器事件变成一级对象,从而让应用程序可以采用面向对象的方式处理它们。这样做有助于模块化和不同应用程序组件之间的代码重用。Iterator API 由两个主要API组成,XMLEventReader和XMLEventWriter,分别由XMLInputStreamFactory和XMLOutputStreamFactory获取。
import java.io.InputStream; import java.util.Iterator; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.Characters; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; public class StAX_Frist { public void readXmlByEvent(InputStream in){ XMLInputFactory factory=XMLInputFactory.newInstance();//获取解析器工厂 try { XMLEventReader reader=factory.createXMLEventReader(in);//获取解析器 while(reader.hasNext()){ XMLEvent event=reader.nextEvent(); switch (event.getEventType()) { case XMLStreamConstants.START_DOCUMENT: System.out.println("start docmuent"); break; case XMLStreamConstants.START_ELEMENT: StartElement element=(StartElement)event; System.out.println("<"+element.getName().getLocalPart()+">"); for(Iterator it=element.getAttributes();it.hasNext();){ Attribute attr=(Attribute) it.next(); System.out.println(attr.getName().getLocalPart()+"="+attr.getValue()); } break; case XMLStreamConstants.CHARACTERS: Characters charData=(Characters)event; if(charData.isIgnorableWhiteSpace()&&charData.isWhiteSpace()){ break; } System.out.println(charData.getData()); break; case XMLStreamConstants.END_ELEMENT: element=(StartElement)event; System.out.println("</"+element.getName().getLocalPart()+">"); break; case XMLStreamConstants.END_DOCUMENT: System.out.println("end docmuent"); break; default: break; } } } catch (Exception e) { e.printStackTrace(); } }