开发者学堂课程【XML入门 :使用 Schema 的 sax 方式操作 xml(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/37/detail/860
使用 Schema 的 sax 方式操作 xml(一)
内容介绍
一、sax 方式只做查询操作
二、打印出整个文档
三、获取到所有的 name 元素的值
四、获取第一个 name 元素的值
五、总结
一、sax 方式只做查询操作
1、使用 jaxp 的 sax 方式解析 xml
* sax 方式不能实现增删改操作,只能做查询操作
2、打开文档,先创建一个 other 文件,命名为 p1.xml
在里面写几个标签
<person>
<p1>
<name> zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age> 30</age>
</p1>
</person>
3、创建类之前要创建包,命名为 cn.itcast.jaxpsax。
3、在里面写一个类,新建一个 class,命名为 testsax。
main 方法生成有一个快捷键,直接写一个 main,加 alt 加斜线,就会直接出来,先写基本的步骤,首先第一步要的到 saxparser 解析器,但是这个解析器通过工厂才能得到,所以第一个步要创建解析器工厂,第二部创建解析器,执行 parse 方法,接下来写下这三部操作。
package cn. itcast.jaxpsax;
import javax. xml . parsers. SAXParserFactory;
public class TestSax {
public static void main(String[] args)throws Exception {
/*
* 1、创建解析器工厂
* 2、创建解析器
* 3、#执行 parse 方法
* */
/ /创建解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory. newInstance();
//创建解析器
SAXParser saxParser = saxParserFactory . newSAXParser();
有异常给抛出去
//执行 parse 方法
saxParser.parse("src/p1. xml ,dh);
}
}
4、saxParser.parse("src/p1. xml ,dh);
里面传两个参数,第一个是路径,第二个传事件处理器,看一下 defaulthandler 的类,这里面需要自己写一个事件处理器,来继承这个类,继承类自后就重新以下三个方法,
*当解析到开始标签时候,执行 startE1 ement 方法,参数 qlame:返回标签名称
*当解析到文本内容时候,执行 characters 方法,通过 string 的构造方法返回内容
*当解析到结束标签时候,执行 endE1 enent 方法,参数 qNane,返回标签名称
需要自己创一个类。
*4、自己创建一个类,继承 defaulthandler
*5、重写类里面的三个方法
5、写一个类,类的位置不能写在//执行 parse 方法的下面,还要往下写。一个里面可以有多个 class 类,但是只能有一个 public,继承这个类。
class MyDefault1 extends DefaultHandler
重写 DefaultHandler 这个方法,这有个快捷键的方法,点击右键,在 source 里面有一个叫 Override/Implement Methods....,点击
可以看到 DefaultHandler 里面所有方法,就找到用的这三个方法,
characters(char, int, int)
endElement(String, String, String)
startElement(String, String, String, Attributes)
把顺序调整一下
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//TODO Auto- generated method stub
super. startElement(uri, localName, qName, attributes);
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto- generated method stub
super. characters(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName )
Throws SAXException {
//TODO Auto- generated method stub
super . endElement(uri, localName, qName ) ;
}
6、dh 写成 new MyDefault1()) ;
7、当开始条件就用 startElement 这个方法,qname 就返回标签名称,比如写一下开始标签。
System. out. println("start:"+qName) ;
第二个方法里面是它的文本内容,里面传三个参数。
System. out . print1n("text: "+new String(ch, start, length)) ;
最后一个是结束标签。
System. out . println("end: " +qName) ;
完整代码如下:
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System. out. println("start:"+qName) ;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System. out . print1n("text: "+new String(ch, start, length)) ;
}
@Override
public void endElement(String uri, String localName, String qName )
Throws SAXException {
System. out . println("end: " +qName) ;
}
执行,看能否将 p 里面的内容打印出来,右键 run as 运行程序。下图是打印出的结果:
里面会有空格,就是解析的时候会把空格和换行都当作内容进行解析。