PULL解析


XML:
什么是 XML?
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 是 W3C 的推荐标准

XML 的用途?
XML 简化数据共享,实现数据传输。


XML 语法规则?
所有 XML 元素都须有关闭标签
  单标记  <TextView/>
  双标记  <TextView></TextView>
XML 标签对大小写敏感
XML 必须正确地嵌套
  <RelativeLayout>
   <TextView></TextView>
   <TextView></TextView>
  </RelativeLayout> 
XML 文档必须有根元素,有且只有一个
XML 的属性值须加引号
实体引用
XML 中的注释
在 XML 中,空格会被保留


XML 标签命名规则
XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格



XML的解析:
SAX解析

DOM解析   Document Object Model
 dom解析的方式将会把整篇XML文档装到
 内存中,形成一颗倒置的DOM树。我们
 可以使用DOM相关的API对DOM树上的任意
 标签进行增删改查。

 
使用DOM4J.jar第三方jar包,以DOM的方式
解析XML文档:
SAXReader reader=new SAXReader();
Document doc=reader.read(文档);
Element e=doc.getRootElement();
//API
e.getName()
e.getText()
e.getTextTrim()
e.elements()  --> List
e.elementIterator()  --> Interator
e.attribute();
e.attributeValue();


}

-----------------------------------------------------------------------------------------------------------------------
PULL解析
 pull解析的方式是使用的事件驱动的 方式解析XML文档。不会将整篇文档都装 入内存中,我们可以在事件驱动的过程 中获取当前标签,并且解析标签的属性 或文本,直到文档解析完成。
 
XmlPullParser parser=Xml.newXXX();
parser.setInput(is, "utf-8");
int event=parser.getEventType();
不断的驱动事件 parser.next()

while(event!=XmlPullParser.END_DOCUMENT){
  //分析每个开始标签并且封装实体类
  
  event = parser.next();
}

具体解析如下:(一)
------------------------------------------------------------------
/**
* 解析音乐集合    xml:
* 使用pull解析方式  

* @throws XmlPullParserException 
* @throws IOException 
*/
public static List<Song> parseMusicList(InputStream is) throws XmlPullParserException, IOException {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(is,"utf-8");
int eventType=parser.getEventType();
List<Song> songs = null;
Song song = null;
while(eventType != XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.END_TAG: //结束标签
String tagName=parser.getName(); //标签名称
if("song".equals(tagName)){
//吧song对象添加到集合中
songs.add(song);
}
break;
case XmlPullParser.START_TAG://开始标签
tagName=parser.getName(); //标签名称
if("song_list".equals(tagName)){ //
songs = new ArrayList<Song>();
}else if("song".equals(tagName)){
song = new Song();
}else if("pic_big".equals(tagName)){
song.setPic_big(parser.nextText());
}else if("pic_small".equals(tagName)){
song.setPic_small(parser.nextText());
}else if("lrclink".equals(tagName)){
song.setLrclink(parser.nextText());
}else if("style".equals(tagName)){
song.setStyle(parser.nextText());
}else if("song_id".equals(tagName)){
song.setSong_id(parser.nextText());
}else if("title".equals(tagName)){
song.setTitle(parser.nextText());
}else if("author".equals(tagName)){
song.setAuthor(parser.nextText());
}else if("album_title".equals(tagName)){
song.setAlbum_title(parser.nextText());
}else if("artist_name".equals(tagName)){
song.setArtist_name(parser.nextText());
}
break;
}
//驱动事件
eventType = parser.next();
}
return songs;

}
具体实例如下:(二)
------------------------------------------------------------------
<student>
<name>&apos;王好&apos;</name>
<age>12</age>
<!-- 继续嵌套子标签 -->
<hobbies count="3"  xxx="yyy">
<hobby>吃</hobby>
<hobby>喝</hobby>
<hobby>玩</hobby>
</hobbies>
<!-- 学校 -->
<school level="职业培训">
<name>Tarena</name>
<location>北京市朝阳区潘家园</location>
</school>
</student>
-----------------------------------------------------------------------------------
/**
* 使用pull的方式解析上面的 student.xml
* @throws IOException
* @throws DocumentException
* @throws XmlPullParserException 
*/
private void parseStudent_PULL() throws IOException, DocumentException, XmlPullParserException {
//1.  创建XmlPullParser解析器
XmlPullParser parser=Xml.newPullParser();
//2.  setInput()
AssetManager manager = this.getAssets();
InputStream is = manager.open("student.xml");
parser.setInput(is, "utf-8");
//3.  驱动事件  获取初始事件类型
int eventType=parser.getEventType();
//不断的驱动事件
Student student = null;
while(eventType != XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
//文档开始时 创建Student对象
student=new  Student();
break;
case XmlPullParser.START_TAG:
String tagName=parser.getName();
if("name".equals(tagName)){//驱动到了name的开始标记
student.setName(parser.nextText());
}else if("age".equals(tagName)){//驱动到了age的开始标签
student.setAge(Integer.parseInt(parser.nextText()));
}else if("hobbies".equals(tagName)){
String count = parser.getAttributeName(0);
String xxx=parser.getAttributeValue(null, "xxx");
student.setHobbies(new ArrayList<String>());
}else if("hobby".equals(tagName)){ //把爱好添加到stduent的集合中
student.getHobbies().add(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
break;
}
//不断的驱动事件
eventType=parser.next();
}
//student已经读取完成
Log.i("", "");
}

你可能感兴趣的:(PULL解析)