Java_SAX解析XML

来源:互联网 发布:财税软件 编辑:程序博客网 时间:2024/06/03 22:50
import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.SAXParseException;import org.xml.sax.helpers.DefaultHandler;public class RSSHandler extends DefaultHandler {static int cur=-1;/** * characters回调函数:当解析到一个节点后就会调用这个函数来接收节点后面的数据,例如<name>数据</name>,解析完<name>节点后调用该函数接受节点后面的数据 */public void characters(char[] ch, int start, int length)throws SAXException {// TODO 自动生成的方法存根super.characters(ch, start, length);String str=new String(ch,start,length);switch(cur){case 2:System.out.print(str+"  ");break;case 3:System.out.print(str+"  ");break;case 4:break;default:break;}}/** * endDocument函数:解析完一个文档后会调用改函数,且只调用一次 */public void endDocument() throws SAXException {// TODO 自动生成的方法存根super.endDocument();System.out.println("解析已经结束");}/** * endElement函数:当解析完一个节点后会调用该函数,例如<name>数据</name>,解析到</name>节点后就调用该函数 * qName:节点的名字相当于DOM中的getNodeName() */public void endElement(String uri, String localName, String qName)throws SAXException {// TODO 自动生成的方法存根super.endElement(uri, localName, qName);System.out.println(qName+"节点解析完成");cur=-1;}/** * error:解析时遇到错误会调用改函数 */public void error(SAXParseException e) throws SAXException {// TODO 自动生成的方法存根super.error(e);System.out.println("解析出错");}/** * 当开始解析文档时最先调用该函数,且只调用一次 */public void startDocument() throws SAXException {// TODO 自动生成的方法存根super.startDocument();System.out.println("解析已经开始");}/** * startElement函数:当开始解析一个节点时会调用该函数,例如<name>数据</name>,解析到<name>节点后就调用该函数 */public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException {// TODO 自动生成的方法存根super.startElement(uri, localName, qName, attributes);if(qName.equals("Books")){System.out.println("图书如下:");cur=0;}if(qName.equals("Book")){System.out.println("Book:");System.out.println(attributes.getLocalName(0)+":"+attributes.getValue(0));cur=1;}else if(qName.equals("name")){System.out.print("name:");cur=2;}else if(qName.equals("price")){System.out.print("price:");cur=3;}else{System.out.print("文本元素:");cur=4;}}}
<pre class="java" name="code">public static void SAX(File file){RSSHandler handler=new RSSHandler();SAXParserFactory factory=SAXParserFactory.newInstance();try {SAXParser paser=factory.newSAXParser();paser.parse(file, handler);} catch (ParserConfigurationException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (SAXException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}

<pre class="html" name="code"><?xml version="1.0" encoding="UTF-8"?><Books>textElement1    <Book id="1">        <name>Java Thinking</name>        <price>100.0</price>    </Book>textElement2    <Book id="2">        <name>C++ Thinking</name>        <price>200.0</price>    </Book>textElement3</Books>

<pre class="plain" name="code">运行结果:(节点之外的数据没有处理例如<Books> <Book>之间的文本元素</Book> <Book>之间的文本元素,</Book> </Books>之间的文本元素)解析已经开始图书如下:文本元素:Book:id:1name:Java Thinking  name节点解析完成price:100.0  price节点解析完成Book节点解析完成Book:id:2name:C++ Thinking  name节点解析完成price:200.0  price节点解析完成Book节点解析完成Books节点解析完成解析已经结束


 

 
0 0
原创粉丝点击