这篇文章给大家分享的是有关如何对XML进行Sax解析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
对XML进行Sax解析:
一、对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解析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。