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 version="1.0" encoding="UTF-8" ?>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);用于處理文本節點(凡是文本,包括空格/換行/元素中的文本(非屬性)都會取出來)
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 ("附上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解析就完成了
新聞熱點
疑難解答