一、对XML举行Sax剖析:
Sax剖析XML是事宜驱动的,装置XML的递次一步一步举行剖析的.长处不必事前调入全部文档,占用资本少,瑕玷是事宜事后,若没保留数据,那末数据就丢了;无状况性;从事宜中只能获得文本,但不知该文本属于哪一个元素.
二、完成:
1.建立一个XMl文档:
<?xml version="1.0" encoding="UTF-8"?> <oracle > <user id="1" > <name>scott</name> <pwd>scott</pwd> </user> <user id="2"> <name>sys</name> <pwd>sys</pwd> </user> <user id="3"> <name>system</name> <pwd>system</pwd> </user> </oracle>
2.最先剖析:
package Sax剖析Xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxParser { public static void main(String[] args) { // 1.实例化SaxParserFactory对象 SAXParserFactory factory = SAXParserFactory.newInstance(); try { // 2.建立剖析器: SAXParser saxParser = factory.newSAXParser(); // 3.猎取须要剖析的文档,生成剖析器,剖析文档 File xmlFile = new File("myXml\\cb.xml"); MyHandler handler = new MyHandler(); // 最先剖析: saxParser.parse(xmlFile, handler); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static class MyHandler extends DefaultHandler { // 作用是来纪录剖析的上一个节点的称号 private String preTag = null; private boolean ifEnd =false; private String getName; private String getPwd; @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub // super.characters(ch, start, length); if (preTag != null) { if ("name".equals(preTag)) { getName = new String(ch, start, length); } else if ("pwd".equals(preTag)) { getPwd = new String(ch, start, length); ifEnd=true; System.out.println(" <name>"+getName+"</name>"); System.out.println(" <pwd>"+getPwd+"</pwd>"); } } } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub // super.endDocument(); System.out.println(" </oracle>"); System.out.println("--------------------------"); System.out.println("剖析XML终了"); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub if(ifEnd==true){ System.out.println(" </user>"); ifEnd=false; } //当一个标签剖析完后,preTag设置为null; preTag = null; } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("最先剖析XML文件"); System.out.println("------------------------------"); System.out.println("<?xml version="+"\""+1.0+"\""+ "encoding="+"\""+"UTF-8"+"\""+"?"+">"); System.out.println(" <oracle>"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub // <user id="1" > if ("user".equals(qName)) { String s = qName; String s1 = attributes.getValue(0);// Id String s2 = attributes.getLocalName(0); //System.out.println(s + s1 + s2); System.out.println(" <"+qName+" "+"id="+"\""+s1+"\""+">"); } preTag = qName; } } }
三、运转效果:
四、补充申明:
1.实行递次:
因为Sax剖析是根据xml文件的递次来剖析,当读入<?xml.....>时,会挪用startDocument()要领,当读入<oracle>的时刻,因为它是个ElementNode,所以会挪用startElement(String uri, String localName, String qName, Attributes attributes),当要获得oracle孩子的信息是,就会挪用characters(char[] ch, int start, int length)要领。
2.内部类加static关键字:
内部类是动态的,也就是开首以public class开首。而主程序是public static class main。在Java中,类中的静态要领不能直接挪用动态要领。只要将某个内部类润饰为静态类,然后才能够在静态类中挪用该类的成员变量与成员要领。所以在不做其他更改的情况下,最简朴的解决办法是将public class改成public static class.
3.startElement(String uri, String localName, String qName,Attributes attributes) 要领的参数诠释:
五、总结:
本日总算把对XML的两种剖析要领搞了一遍,当初先生让写,本身不写,也许写了个Sax,如今都看不懂,我也是醉了,经由过程两种要领,我以为Sax剖析比较轻巧。
以上就是详解对XML举行Sax剖析的示例代码分享的细致内容,更多请关注ki4网别的相干文章!