XML——XML解析之SAX
1.SAX解析
1.1.SAX解析机制sax是一种推式的机制,你创建一个sax解析器,解析器在发现xml文档中的内容时就告诉你(把事件推给你,有点类似于java swing中的事件监听)。如何处理这些发现的内容,由程序员自己决定。 在基于sax的程序中,有五个最常用的sax事件:
1.2.SAX解析实例依然使用DOM解析中用到的XML例子,如下: <?xml version="1.0" encoding="utf-8" standalone="no"?>
<班级>
<学生 地址="香港">
<名字>周小星</名字>
<年龄>23</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生 地址="澳门">
<名字>林晓</名字>
<年龄>25</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
【步骤】: 1.使用SAXParserFactory创建SAX解析工厂 SAXParserFactory spf = SAXParserFactory.newInstance(); 2.通过SAX解析工厂得到解析器对象 SAXParser sp = spf.newSAXParser(); 3.将解析对象和事件处理器对象关联 sp.parse("src/myClass.xml",new MyHandler());
这里的 class MyHandler extends DefaultHandler{
/** * 发现文档开始,该函数只会被调用一次 */
@Override
public void startDocument() throws SAXException {
System.out.println("startDocument");
}
/** * 发现文档结束,该函数只会被调用一次 */
@Override
public void endDocument() throws SAXException {
System.out.println("endDocument");
}
/** * 发现XML中的一个元素开始,会被反复调用 */
@Override
public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException {
System.out.println("元素名称:"+qName);
}
/** * 发现XML中的一个元素结束,会被反复调用 */
@Override
public void endElement(String uri,String qName)
throws SAXException {
}
/** * 发现XML文件中的文本,会被反复调用 */
@Override
public void characters(char[] ch,int start,int length)
throws SAXException {
// 显示文本内容
String text = new String(ch,start,length);
if(!text.trim().equals("")){
System.out.println(text);
}
}
}
运行结果如下: 可以看到,这是对XML文档的一种遍历,而sax能够做的也只是遍历了。 那么,如果现在我们有这样一个需求: 我们可以在 1.定义两个布尔变量 private boolean isName = false;
private boolean isAge = false;
2.在 @Override
public void startElement(String uri,Attributes attributes) throws SAXException {
if(qName.equals("名字")){
this.isName = true;
}else if(qName.equals("年龄")){
this.isAge = true;
}
}
3.在 @Override
public void characters(char[] ch,int length)
throws SAXException {
// 显示文本内容
String text = new String(ch,length);
if(!text.trim().equals("")&&(isName||isAge)){
System.out.println(text);
}
isName = false;
isAge = false;
}
最后要记得将两个布尔变量复位成false。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |