开发者学堂课程【XML入门 :使用 Schema 的 sax 方式操作 xml(二)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/37/detail/860
使用 Schema 的 sax 方式操作 xml(二)
二、打印出整个文档
1、现在有一个需求是打印出整个文档,比如把 p1.xml 里面的内容都打印出来,这里面加了标签,标出什么样,打印出就什么样。
<person>
<p1>
<name> zhangs an</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age> 30</age>
</p1>
</person>
2、首先看 console 里面 qname 只加名称,加标签就拼接,println 就不需要 ln了,因为会把标签里面的空格换行都当成内容解析,ln 表示自动换行,删掉,变成System. out . print("<"+qName+">");
文本也不需要了,
System. out . print(new String(ch, start, length)) ;
结束标签
System. out . print("</" +qName+"> ." ) ;
这样就可以得到整个文档,然后运行一下,是否可以得到。
运行结果如下:
<person>
<p1>
<name> zhangsan< /name>
<age> 20</age>
</p1>
<p1>
<name> lisi< /name>
<age>30</age>
</p1>
< / person>
得到整个文档。
只要把 new MyDefault1 传进来,它里面的方法就会自动去执行。
***执行 parse 方法,第一个参数 xml 路径,第二个参数是事件处器
***创建一个类,继承事件处理器的类,
***重写里面的三个方法
三、获取到所有的 name 元素的值
1、需求获取到所有的 name 元素的值。
//实现获取所有的 name 元素的值
class MyDefault2 extends DefaultHandler {
重写它里面的三个方法,右键 source-Override/Implement Methods
选择 characters(char, int, int),endElement(String, String, String),startElement(String, String, String, Attributes)
调整顺序,打印出里面所有 name 的元素,当解析到 name,会把 name 元素返回来,qname 是 name 元素。
/ /判断 qName 是否是 name 元素
if(" name" . equals(qName) {
表示出里面是 name 元素,注意开始叫 name,结束也叫 name,这里面就不能打印出它的值,首先可以定义一个变量 boolean 类型
boolean flag = false;
比如当解析到 name 元素
Flag=true;
当值是 true 时,让 characters 把内容打印出来
/ /当 flag 值是 true 时候,表示解析到 name 元素
if(flag==true ){
System. out. println(new String(ch, start,length)) ;
}
这样就可以打印出来。
/ /把 flag 设置成 false ,表示 name 元素结束
if("name" .equals(qName)) {
flag = false;
这样就可以把 name 里面的值都打印出来,过程是首先定义一个成员变量叫 flag,它的值是 false,当里面是 name 元素时,qname 就是 name,把 flag 改成 true,当 flag 等于 true 时,这就代表解析到 name 元素,把里面内容打印出来,最后表示结束的 name,再把 flag 设置成 false,就表示解析的部分结束,就是这样一个过程。
把 MyDefault1 改成 MyDefault2,再执行以下,看是否能把 name 的值都打印出来,结果如下,zhangsan,lisi 都打印出来了。
四、获取第一个 name 元素的值
1、加一个索引或者下标
Int indx =1;
2、当执行到以下方法时,表示第一次 name 就完成了,当 idx 等于1时取到的就是第一个 name 元素。
@Override
public void endElement(String uri, String localName, String qName )
Throws SAXException{
//把 flag 设置成 false,表示 name 元素结束
if("name" . equals(qName)) {
flag = false;
Idx++;
}
}
3、如何表示索引是1
//当 flag 值是 true 时候,表示解析到 name 元素
//索引是1
if(f1ag==true&&idx==1){
System. out . println(new String( ch, start, length));
}
这样得到的就是第一个 name 元素的值。执行看效果,得到 zhangsan。
这就表示得到具体某一个元素的值,它就是这么一个写法。
五、总结
使用 jaxp 的 sax 方式解析 xml
* sax 方式不能实现增删改操作,只能做查询操作
**打印出整个文档
***执行 parse 方法,第一个参数 xml 路径,第二个参数是事件处理器
***创建一个类,继承事件处理器的类,
***重写里面的三个方法
*获取到所有的 name 元素的值
**定义一个成员变量 flag= false
**判断开始方法是否是 name 元素,如果是 name 元素,把 flag 值设置成 true
**如果 flag 值是 true,在 characters 方法里面打印内容
**当执行到结束方法时候,把 flag 值设置成 false
*获取第一个 name 元素的值
定义一个成员变量 idx=1
**在结束方法时候,idx+1 idx++
**想要打印出第一个 name 元素的值,
-在 characters 方法里面判断,
--判断 flag=true 并且 idx==1 ,在打印内容