Xml解析-XmlPullParser解析⽰例分析
Xml解析 - XmlPullParser解析⽰例分析
XmlPullParser是⼀种事件驱动的XML⽂件解析⽅式。由于Android系统已经集成了该部分,且Android framework中有关XML⽂件的解析的部分,基本都是使⽤这种⽅式去处理的;所以,我们有必要学习、了解XmlPullParser的解析过程及使⽤⽅法,以便我们阅读Android 源码或在⼯作中使⽤。
XmlPullParser以事件驱动解析流程,我们平时常⽤的事件有:
XmlPullParser.START_DOCUMENT:XML解析器⽬前在⽂件的最开始处,此事还没有读到任何数据
XmlPullParser.END_DOCUMENT:逻辑意义上的⽂件末尾;表明当前XML解析器处理的⽂件流已经到末端
XmlPullParser.START_TAG:XML解析器解析到了⼀个开始标签
XmlPullParser.END_TAG:XML解析器解析到了⼀个结束标签
XmlPullParser.TEXT:XML解析器解析到了字符数据
另外还有其他的XmlPullParser.CDSECT、XmlPullParser.ENTITY_REF等事件,因这些事件较少涉及到,这⾥就不做分析了。
我们通过XmlPullParser解析器读取到每个事件后,都可以根据事件的类型来进⾏相应的处理。如,遇到XmlPullParser.START_TAG,我们就能获取到当前TAG的名字,然后根据我们⾃⼰设定的TAG的含义,去进⾏后续的解析、读取⼯作。
XmlPullParser使⽤中有时会涉及到当前解析的标签在整个XML结构中的所处的⾼度问题,我们通常调⽤getDepth()函数来获取当前TAG 所处的⾼度值。下⾯我们借助⼀个⽰例,来看下XmlPullParser是如何定义TAG的⾼度的。
⽰例⼀
我们要解析的XML内容如下:
<?xml version="1.0" encoding="utf-8"?>
<root>
<A>
<B>
<C>
</C>
<D />
</B>
</A>
<E>
<F />
</E>
<G />
</root>
接着使⽤XmlPullParser写⼀段XML解析代码,通过打印来看每个节点的⾼度值是怎样的:
public class XmlPullMain {
public static void main(String[] args) {
try {
// InputStream xmlStream = new FileInputStream(new File("l")); // XmlPullMain parserTool = new XmlPullMain();
// parserTool.parserXmlByPull(xmlStream, "UTF-8");
InputStream xmlStream = new FileInputStream(new
File("l"));
XmlPullMain parserTool = new XmlPullMain();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public void testDepth(InputStream xmlStream, String xmlEncode) {
XmlPullParserFactory factory = null;
XmlPullParser parser = null;
try {
factory = wInstance();
factory.setNamespaceAware(true);
parser = wPullParser();
parser.setInput(xmlStream, xmlEncode);
int event = EventType();
System.out.println("start current depth: " + Depth());
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT:
System.out.println("START_DOCUMENT depth: " + Depth()); break;
case XmlPullParser.START_TAG:
String node = Name();
if (node.equals("root")) {
System.out.println("root START_TAG depeth: " + Depth()); } else if (node.equals("A")) {
System.out.println("A START_TAG depeth: " + Depth());
} else if (node.equals("B")) {
System.out.println("B START_TAG depeth: " + Depth());
} else if (node.equals("C")) {
System.out.println("C START_TAG depeth: " + Depth());
} else if (node.equals("D")) {
System.out.println("D START_TAG depeth: " + Depth());
} else if (node.equals("E")) {
System.out.println("E START_TAG depeth: " + Depth());
} else if (node.equals("F")) {
System.out.println("F START_TAG depeth: " + Depth());
} else if (node.equals("G")) {
System.out.println("G START_TAG depeth: " + Depth());
}
break;
case XmlPullParser.TEXT:
System.out.println("--TEXT depth: " + Depth());
break;
case XmlPullParser.END_TAG:
String nodeEnd = Name();
if (nodeEnd.equals("root")) {
System.out.println("root END_TAG depeth: " + Depth());
} else if (nodeEnd.equals("A")) {
System.out.println("A END_TAG depeth: " + Depth());
} else if (nodeEnd.equals("B")) {
System.out.println("B END_TAG depeth: " + Depth());
} else if (nodeEnd.equals("C")) {
System.out.println("C END_TAG depeth: " + Depth());
} else if (nodeEnd.equals("D")) {
System.out.println("D END_TAG depeth: " + Depth());
System.out.println("D END_TAG depeth: " + Depth());
} else if (nodeEnd.equals("E")) {
System.out.println("E END_TAG depeth: " + Depth());
} else if (nodeEnd.equals("F")) {
System.out.println("F END_TAG depeth: " + Depth());
} else if (nodeEnd.equals("G")) {
System.out.println("G END_TAG depeth: " + Depth()); }
break;
case XmlPullParser.CDSECT:
break;
default:
break;
}
event = ();
}
} catch (Exception e) {
}
}
}
代码的执⾏结果如下:
start current depth: 0
START_DOCUMENT depth: 0
root START_TAG depeth: 1
--TEXT depth: 1
A START_TAG depeth: 2
--TEXT depth: 2
B START_TAG depeth: 3
--TEXT depth: 3
C START_TAG depeth: 4
--TEXT depth: 4
C END_TAG depeth: 4
--TEXT depth: 3
D START_TAG depeth: 4
D END_TAG depeth: 4
--TEXT depth: 3
B END_TAG depeth: 3
--TEXT depth: 2
A END_TAG depeth: 2
--TEXT depth: 1
E START_TAG depeth: 2
--TEXT depth: 2
F START_TA
G depeth: 3
F END_TA
G depeth: 3
--TEXT depth: 2
E END_TAG depeth: 2
--TEXT depth: 1
G START_TAG depeth: 2
G END_TAG depeth: 2
--TEXT depth: 1
root END_TAG depeth: 1
根据输出结果,我们可以在Xml⽂件中标记处各个节点的⾼度值:
<root><!-- 1 -->
<A><!-- 2 -->
<B><!-- 3 -->
<C><!-- 4 -->
</C><!-- 4 -->
<D /><!-- 4 -->
</B><!-- 3 -->
</A><!-- 2 -->
<E><!-- 2 -->
<F /><!-- 3 -->
</E><!-- 2 -->
<G /><!-- 2 -->
</root><!-- 1 -->
注释标签中的整数值即为当前节点所处的⾼度,从结果可以看到:XmlPullParser对节点⾼度的处理是基于它所处的层次结构得出的。如果我们的XML⽂件写的层次清晰的话, 就很容易看出其中各个节点所处的⾼度情况。
另外,从输出结果,我们还看到:
<a> ... </a>这种形式的标签,解析时会读取到两个TEXT事件:⼀个在<a> START_TAG之后产⽣,⼀
个在</a> END_TAG之后产⽣
<b />这种形式的标签只会在<b> END_TAG之后读取到⼀个TEXT事件,<b> START_TAG之后不会产⽣TEXT事件
这种TEXT事件有时候对我们是没有意义的,基于这种原因,我们在使⽤XmlPullParser解析Xml⽂件时,要根据⾃⼰的需要来处理得到的事件。
XmlPullParser的基本⽤法就跟上⾯⽰例所展⽰的那样:
⾸先获取到需要解析的XML⽂件对应的InputStream流
实例化XmlPullParserFactory⼯⼚对象
再借助⼯⼚对象获取XmlPullParser类型的解析器实例
然后再进⾏解析即可。
XmlPullParser的使⽤模式较为固定,这⾥不再做过多说明;其他的问题可以看它的源码来得到答案。
⽰例⼆
下⾯再给出⼀个模仿l配置⽂件解析过程的⽰例。
我们要解析的Xml⽂件内容:
<manifest package="ample.androidtest" ><!-- 1 -->
<uses-sdk
minSdkVersion="19"
targetSdkVersion="21">kitkat4.4</uses-sdk><!-- 2 -->
<application
allowBackup="true"
icon="ic_launcher" ><!-- 2 -->
<activity
name="MainActivity"
label="app_name" ><!-- 3 -->
<intent-filter><!-- 4 -->
<action name="android.intent.action.MAIN" /><!-- 5 -->
<category name="android.intent.category.LAUNCHER" /><!-- 5 --> </intent-filter><!-- 4 -->
</activity><!-- 3 -->
<activity
name="DefaultActivity"
label="def_name" ><!-- 3 -->
<intent-filter><!-- 4 -->
<category name="android.intent.category.LAUNCHER" /><!-- 5 --> </intent-filter><!-- 4 -->
<intent-filter><!-- 4 -->
<category name="android.intent.category.HOME" /><!-- 5 -->
</intent-filter><!-- 4 -->
</activity><!-- 3 -->
</application><!-- 2 -->
<application
allowBackup="false"
icon="ic_launcher"><!-- 2 -->
<activity
name="TestActivity"
label="test_name" ><!-- 3 -->
<intent-filter><!-- 4 -->
switch函数用法举例
<category name="android.intent.category.LAUNCHER" /><!-- 5 --> </intent-filter><!-- 4 -->
</activity><!-- 3 -->
</application><!-- 2 -->
</manifest><!-- 1 -->
<!-- 0 -->
这⾥只是模仿了Android配置⽂件中的形式。再看具体的解析代码:public class XmlPullMain {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论