PULL解析XML的运行机制详解
PULL: Android内置了PULL解析器。PULL解析器与SAX解析器类似,它提供了类似的事件,例如,开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发事件。每一种事件将作为数值代码被传送,因此使用一个switch来对感兴趣的事件进行处理。 <![CDATA[文本内容]]>
CDATA的文本内容中不能出现字符串“]]>”
,另外,CDATA不能嵌套。 二、一些比较重要复杂的常见方法:结合源代码解析1) int nextTag():Call next() and return event if it is START_TAG or END_TAG otherwise throw an exception. It will skip whitespace TEXT before actual tag if any. 2) String nextText():If current event is START_TAG then if next element is TEXT then element content is returned or if next event is END_TAG then empty string is returned,otherwise exception is thrown. After calling this function successfully parser will be positioned on END_TAG. This function together with nextTag make it very easy to parse XML that has no mixed content. 3)int nextToken():This method works similarly to next() but will expose additional event types (COMMENT,CDSECT,DOCDECL,ENTITY_REF,PROCESSING_INSTRUCTION,or IGNORABLE_WHITESPACE) if they are available in input. 4)public int next()throws XmlPullParserException,java.io.IOException //返回下一个解析事件 5) void require(int type,String namespace,String name)Test if the current event is of the given type and if the if (type != getEventType() 三、解析过程讲解(1) 创建PULL解析器 :两种方法实质一样: /** * 读取RAW(在res文件夹下新建的)目录下的文件测试Pull解析xml文件 * START_DOCUMENT后是persons是START_TAG,后跟着是TEXT * END_TAG后紧跟着是TEXT * 如果当前标签是START_TAG,则getTExt()返回的是null */
private void getXmlData2(){
String tagname=null;
int m=0,n=0;
InputStream is = this.getResources().openRawResource(R.raw.test);//读取RAW(在res文件夹下新建的)目录下的test.xml文件
try {//创建XmlPullParser
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(is,"UTF-8");
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
case XmlPullParser.START_DOCUMENT: //START_DOCUMENT后是persons是START_TAG,后跟着是TEXT
System.out.println("START_DOCUMENT");
break;
case XmlPullParser.TEXT:
if(m==1){
System.out.println("START_TAG后是TEXT");
m=0;
}
break;
case XmlPullParser.START_TAG: //标签开始
if("persons".equals(parser.getName())){
System.out.println("START_DOCUMENT后是START_TAG");
m++;
}
if ("person".equals(parser.getName())) {
for(int i=0;i<parser.getAttributeCount();i++)
System.out.println("id:"+parser.getAttributeValue(i));
}else if(("name").equals(parser.getName())){
//System.out.println("name:"+parser.getText());//null
tagname = parser.nextText();
System.out.println("name:"+tagname);
}else if("age".equals(parser.getName())){
tagname = parser.nextText();
System.out.println("age:"+tagname);
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(parser.getName())) {
System.out.println("person标签结束");
}
break;
}
event = parser.next();
System.out.println("eventType:"+event);//2是START_TAG,4是TEXT
}
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
xml源文件: <?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="0">
<name>张超</name>
<age>20</age>
</person>
<person id="1">
<name>小明</name>
<age>21</age>
</person>
</persons>
解析过程: 在开始讲解执行过程之前,先说下每个标签的执行过程: if(n==1){
System.out.println("name后:"+parser.getText());
n=0;
}
3. 下面总结一下运行过程:START_DOCUMENT ,START_TAG ,TEXT ,END_TAG,TEXT,START_TAG …… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |