xml介绍与解析

    xiaoxiao2021-03-26  25

    一、了解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; > 大于 & & 与 ' ' 单引号 " " 引号 等等。。。

    命名规则

    名称可以含字母、数字以及其他的字符 名称不能以数字或者标点符号开始 名称不能以字符 “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解析就完成了

    转载请注明原文地址: https://ju.6miu.com/read-660929.html

    最新回复(0)