xml介绍与解析

来源:互联网 发布:淘宝图片怎么搜索引擎 编辑:程序博客网 时间:2024/06/06 20:27

一、了解xml

1.xml

extended Markup Language可扩展标记语言

<?xml version="1.0" encoding="UTF-8"?><weatherinfo><cityname>北京</cityname><citycode>101010100</citycode><citydesc>北京</citydesc><publishtime>2015年03月20日11:00</publishtime><lastupdate>2015-03-20 11:08:10</lastupdate><data><date>2015-03-20</date><icon>d00|n00</icon><weather>晴间多云</weather><temperature>20°C/6°C</temperature><winddirect>无持续风向转北风微风转3-4级</winddirect></data><data><date>2015-03-21</date><icon>d00|n01</icon><weather></weather><temperature>19°C/4°C</temperature><winddirect>北风4-5级转3-4级</winddirect></data><data><date>2015-03-22</date><icon>d01|n00</icon><weather>多云转晴</weather><temperature>14°C/3°C</temperature><winddirect>无持续风向微风</winddirect></data><data><date>2015-03-23</date><icon>d00|n00</icon><weather></weather><temperature>15°C/3°C</temperature><winddirect>无持续风向微风</winddirect></data><data><date>2015-03-24</date><icon>d00|n01</icon><weather>晴转多云</weather><temperature>16°C/5°C</temperature><winddirect>无持续风向微风</winddirect></data><data><date>2015-03-25</date><icon>d01|n01</icon><weather>多云</weather><temperature>16°C/5°C</temperature><winddirect>无持续风向微风</winddirect></data><data><date>2015-03-26</date><icon>d01|n01</icon><weather>多云</weather><temperature>20°C/5°C</temperature><winddirect>南风转无持续风向3-4级转微风</winddirect></data><live><updatetime>10:20</updatetime><temperature>9℃</temperature><humidity>26%</humidity><winddirect>南风2级</winddirect></live></weatherinfo>

就是这么一种格式的字符串(weatherinfo)

xml简述

  • XML是一种数据存储和传输的常用格式
  • 它与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,它仅仅是存储数据。事实上它与其他数据表现形式最大的不同是:它极其简单,这是一个看上去有点琐细的优点,但正是这点使它与众不同。
  • 平台无关性,语言无关性,系统无关性
  • DOM:Document Object Model,文档对象模型,DOM 是基于 XML 文档树结构的解析。这种方式是 W3C 推荐的处理 XML 的一种方式

xml书写

  • 开始标签和结束标签对应。
  • 必须正确地嵌套,重复标签不能嵌套
  • 区分大小写
  • 文档必须有根元素
  • 它的属性值须加引号 < student id=”1”>
  • 注释< ! – 注释 –>

xml组成

前导区

 <?xml version="1.0" encoding="UTF-8" ?>

version:版本号;encoding:字符集

数据区

XML 文档形成一种树结构
XML 文档必须包含根元素。该元素是所有其他元素的父元素
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端

实体引用(类似转义字符)

&lt;    <   小于  &gt;    >   大于  &amp;   &   与   &apos;  '   单引号 &quot;  "   引号  等等。。。

命名规则

名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
可使用任何名称,没有保留的字词

二、解析xml

三种解析方法:DOM,SAX,PULL(我只知道这三种 O(∩_∩ )O哈哈~ )

DOM:Document Object Model,文档对象模型,DOM 是基于 XML 文档树结构
的解析。这种方式是 W3C 推荐的处理 XML 的一种方式

在安卓中内置了pull解析器,所以主要介绍pull解析

pull解析器

  • pull解析器是android内置的解析器,解析原理与sax类似
  • pull提供了类似的事件。 如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应的事件,事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法获取下一个Text类型节点的值

以事件驱动的方式解析

0:(XmlPullParser.START_DOCUMENT);文档开始
1:(XmlPullParser.END_DOCUMENT);文档结束
2:(XmlPullParser.START_TAG);标签开始
3:(XmlPullParser.END_TAG);标签结束
4:(XmlPullParser.TEXT);用于处理文本节点(凡是文本,包括空格/换行/元素中的文本(非属性)都会取出来)

解析步骤

  • 创建pull解析的工厂类对象
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;//获取<month...>xxx</month>中的有效文本,过滤换行,空格等    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如下:

<?xml version="1.0" encoding="UTF-8"?><students>    <student id="1" id1="2">        <name>张三</name>        <sex></sex>        <age>20</age>    </student>    <student id="2">        <name>李四</name>        <sex></sex>        <age>22</age>    </student>    <student id="3">        <name>王五</name>        <sex></sex>        <age>23</age>    </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<Student> 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<Student>();                }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解析就完成了

1 0
原创粉丝点击