extended Markup Language可扩展标记语言
<weatherinfo>
<cityname>北京cityname>
<citycode>101010100citycode>
<citydesc>北京citydesc>
<publishtime>2015年03月20日11:00publishtime>
<lastupdate>2015-03-20 11:08:10lastupdate>
<data>
<date>2015-03-20date>
<icon>d00|n00icon>
<weather>晴间多云weather>
<temperature>20°C/6°Ctemperature>
<winddirect>无持续风向转北风微风转3-4级winddirect>
data>
<data>
<date>2015-03-21date>
<icon>d00|n01icon>
<weather>晴weather>
<temperature>19°C/4°Ctemperature>
<winddirect>北风4-5级转3-4级winddirect>
data>
<data>
<date>2015-03-22date>
<icon>d01|n00icon>
<weather>多云转晴weather>
<temperature>14°C/3°Ctemperature>
<winddirect>无持续风向微风winddirect>
data>
<data>
<date>2015-03-23date>
<icon>d00|n00icon>
<weather>晴weather>
<temperature>15°C/3°Ctemperature>
<winddirect>无持续风向微风winddirect>
data>
<data>
<date>2015-03-24date>
<icon>d00|n01icon>
<weather>晴转多云weather>
<temperature>16°C/5°Ctemperature>
<winddirect>无持续风向微风winddirect>
data>
<data>
<date>2015-03-25date>
<icon>d01|n01icon>
<weather>多云weather>
<temperature>16°C/5°Ctemperature>
<winddirect>无持续风向微风winddirect>
data>
<data>
<date>2015-03-26date>
<icon>d01|n01icon>
<weather>多云weather>
<temperature>20°C/5°Ctemperature>
<winddirect>南风转无持续风向3-4级转微风winddirect>
data>
<live>
<updatetime>10:20updatetime>
<temperature>9℃temperature>
<humidity>26%humidity>
<winddirect>南风2级winddirect>
live>
weatherinfo>
就是这么一种格式的字符串(weatherinfo)
前导区
version:版本号;encoding:字符集
数据区
XML 文档形成一种树结构
XML 文档必须包含根元素。该元素是所有其他元素的父元素
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端
< < 小于
> > 大于
& & 与
' ' 单引号
" " 引号
等等。。。
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
可使用任何名称,没有保留的字词
三种解析方法:DOM,SAX,PULL(我只知道这三种 O(∩_∩ )O哈哈~ )
DOM:Document Object Model,文档对象模型,DOM 是基于 XML 文档树结构
的解析。这种方式是 W3C 推荐的处理 XML 的一种方式
在安卓中内置了pull解析器,所以主要介绍pull解析
0:(XmlPullParser.START_DOCUMENT);文档开始
1:(XmlPullParser.END_DOCUMENT);文档结束
2:(XmlPullParser.START_TAG);标签开始
3:(XmlPullParser.END_TAG);标签结束
4:(XmlPullParser.TEXT);用于处理文本节点(凡是文本,包括空格/换行/元素中的文本(非属性)都会取出来)
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();//注意大小写
XmlPullParser parser = factory.newPullParser();
parser.setInput(new FileReader("student.xml"));//我的文件是放在项目根目录下
在项目根目录下,形参是Reader类型.
parser.setInput(new FileInputStream("student.xml"),"utf-8");
解析中文,形参是InputStream类型.
int eventType = parser.getEventType();在开始解析之前要先获取一次
parser.getName();获取标签名称
parser.nextText()获取标签内部的文本(tag匹配子元素而非对象根元素时)
XmlPullParser.TEXT中会用到parser.getText();获取当前节点的文本(适用于单行对象,没有子节点的文档)
eventType=parser.next();获取下一个标签的事件类型,用在循环体里面的最后一句
附:xml单行元素的pull解析
while (eventType != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
list = new ArrayList<Month>();
break;
case XmlPullParser.START_TAG:
if ("month".equals(tagName)) {
month = new Month();
int attributeCount = parser.getAttributeCount();
for (int i = 0; i < attributeCount; i++) {
String attrName = parser.getAttributeName(i);
String attrValue = parser.getAttributeValue(i);
if ("id".equals(attrName)) {
month.setId(Integer.parseInt(attrValue));
} else if ("shop".equals(attrName)) {
month.setShop(attrValue);
} else if ("price".equals(attrName)) {
month.setPrice(Double.parseDouble(attrValue));
}
}
}
break;
//获取xxx中的有效文本,过滤换行,空格等
case XmlPullParser.TEXT:
String content = parser.getText();
String core = content.trim();//去掉字符串首尾的空白,只保留核心内容
if (core.length() != 0) {
month.setMonthValue(Integer.parseInt(core));
}
break;
case XmlPullParser.END_TAG:
if ("month".equals(tagName)) {
list.add(month);
}
break;
}
eventType = parser.next();//如果没有,将陷入死循环
}
附上Demo:
解析student.xml
xml如下:
<students>
<student id="1" id1="2">
<name>张三name>
<sex>男sex>
<age>20age>
student>
<student id="2">
<name>李四name>
<sex>男sex>
<age>22age>
student>
<student id="3">
<name>王五name>
<sex>男sex>
<age>23age>
student>
students>
为了方便输出观察,写了个Student对象,用于输出解析的结果
Student.java
public class Student {
private int id;
private String name;
private String sex;
private int age;
public Student() {
}
public Student(int id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex
+ ", age=" + age + "]";
}
}
public class PullParseDemo1 {
public static void main(String[] args) throws XmlPullParserException,
IOException {
List students = null;
Student student = null;
// 1、获取一个XmlPullParser解析器.
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); // 调用解析器工厂的静态方法,创建一个解析器工厂
XmlPullParser parser = factory.newPullParser(); // 创建一个pull解析器
parser.setInput(new FileReader("students.xml")); // 设置一个输入流,告诉要解析的xml数据的来源
int event = parser.getEventType(); // 获取当前事件的类型
while (event != END_DOCUMENT) { // 当碰到文档结束的时候,结束循环
switch (event) {
case START_TAG:
String tag = parser.getName();
if("students".equals(tag)){
students = new ArrayList();
}else if("student".equals(tag)){
student = new Student();
// System.out.println(parser.getAttributeCount()); //获取这个标签的属性的个数。
// System.out.println(parser.getAttributeName(0)); //获取指定索引的属性的名字
student.setId(Integer.parseInt(parser.getAttributeValue(null, "id")));
System.out.println(parser.getAttributeValue(null, "id")); //参数1:是命名空间,如果命名空间,则传入null。参数2:属性的名字
students.add(student);
}else if("name".equals(tag)){
student.setName(parser.nextText()); //获取当前事件后面的text事件,text的值
}else if("age".equals(tag)){
student.setAge(Integer.parseInt(parser.nextText())); //获取当前事件后面的text事件,text的值
}else if("sex".equals(tag)){
student.setSex(parser.nextText()); //获取当前事件后面的text事件,text的值
}
break;
case END_TAG:
// System.out.println("碰到了结束标签" + " " + parser.getName());
break;
case TEXT:
// System.out.println("碰到了文本标签" +" " + parser.getText());
break;
default:
break;
}
event = parser.next();
}
for (Student student2 : students) {
System.out.println(student2);
}
}
}
xml解析就完成了