xml有两种解析思想分别是sax解析和xml解析,他们的解析原理分别为下图
sax解析思路:得到解析器在解析的过程中会发触发解析事件,通过解析事件解析xml文档
(1)获得解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
(2)通过工厂获得sax解析器
SAXParser parser = factory.newSAXParser();
(3)获取读取器
XMLReader reader = parser.getXMLReader();
(4)注册解析事件
reader.setContentHandler(new MycontentHandler());
(5)解析xml
reader.parse("文件");
例子:利用sax解析思想解析xml文件。
需要解析的xml文件
<?xml version="1.0" encoding="UTF-8"?> <书架> <书> <书名>Java就业培训教程</书名> <作者>小凌</作者> <售价>39.00元</售价> <特价>20</特价> </书> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架>解析的Java代码
package saxdemo; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; public class sax { public sax()throws Exception{ //1获得解析器工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //2通过工厂获得sax解析器 SAXParser parser = factory.newSAXParser(); //3获得读取器 XMLReader reader = parser.getXMLReader(); //4注册事件 reader.setContentHandler(new MycontentHandler()); //5解析xml reader.parse("book.xml"); } } //注意:继承DefaulHandler,可以只覆盖自己想用的函数。 class MycontentHandler implements ContentHandler{ //文档开始 public void startDocument() throws SAXException { System.out.println("文档开始"); } //标签开始 public void startElement(String arg0,String arg1,String arg2,Attributes arg3) throws SAXException { System.out.println("标签开始"+arg2); } //文档结束了 public void endDocument() throws SAXException { System.out.println("文档结束了"); } //标签结束 public void endElement(String arg0,String arg2) throws SAXException { System.out.println("标签结束了"+arg2); } //接收字符数据的通知。 public void characters(char[] arg0,int arg1,int arg2) throws SAXException { System.out.println(new String(arg0,arg1,arg2)); } public void endPrefixMapping(String arg0) throws SAXException { } public void ignorableWhitespace(char[] arg0,int arg2) throws SAXException { } public void processingInstruction(String arg0,String arg1) throws SAXException { } public void setDocumentLocator(Locator arg0) { } public void skippedEntity(String arg0) throws SAXException { } public void startPrefixMapping(String arg0,String arg1) throws SAXException { } }注意:解析的时候空格也会被当做一个元素,对于上面的函数可以查看jdk文档。