PS:當你的才華還撐不起你的野心時,那你需要靜下心來學習.....
學習內容:
1.從服務器上獲取XML文檔...
2.解析XML文檔中的內容...
XML文件想必大家都非常的熟悉,可擴展的標記語言,通過節點的方式對數據進行保存,學過HTML的都很清楚,XML文檔與其非常的相似(結構上相似而已),因此我們可以把一些數據保存在XML文檔當中,然后通過解析XML文檔從中獲取相關的數據信息...我也就不賣關子了...直接說一下我如何通過XML文檔到底做了什么事情吧...就拿Android中的ListView來說吧...Android中自身提供的列表是非常普通的,沒有什么樣式,而我為每一個列表子選項都設置了一個簡單的樣式,每一個樣式其中有着不同的內容...直接放一張圖片吧...
其實就是為了實現上面的效果,因為每一個列表項對應着不同的內容以及圖片數據...但是每一個列表項中元素的個數是相同的,並且格式也是相同的...因此我就使用了XML文檔來保存了其中的數據信息....下面是xml文檔中的數據信息...放置在了一個服務器上...通過http://www.iitbox.com/admin/java_basic.xml可以直接訪問到...

<?xml version="1.0" encoding="utf-8"?> <basic> <content> <id>1</id> <title>Java summary</title> <artist>Darker</artist> <duration>34:28</duration> <thumb_url>http://www.iitbox.com/admin/java_summary.jpg</thumb_url> </content> <content> <id>2</id> <title>Java content introduction</title> <artist>Darker</artist> <duration>44:28</duration> <thumb_url>http://www.iitbox.com/admin/java_content.jpg</thumb_url> </content> <content> <id>3</id> <title>Java Variable</title> <artist>Darker</artist> <duration>44:58</duration> <thumb_url>http://www.iitbox.com/admin/java_Variable.jpg</thumb_url> </content> <content> <id>4</id> <title>Java Operator</title> <artist>Darker</artist> <duration>51:25</duration> <thumb_url>http://www.iitbox.com/admin/java_operator.jpg</thumb_url> </content> <content> <id>5</id> <title>Java flow control</title> <artist>Darker</artist> <duration>57:22</duration> <thumb_url>http://www.iitbox.com/admin/java_flow_control.jpg</thumb_url> </content> <content> <id>6</id> <title>Java Object</title> <artist>Darker</artist> <duration>56:41</duration> <thumb_url>http://www.iitbox.com/admin/java_object.jpg</thumb_url> </content> <content> <id>7</id> <title>Member methods and properties</title> <artist>Darker</artist> <duration>59:12</duration> <thumb_url>http://www.iitbox.com/admin/java_member.jpg</thumb_url> </content> <content> <id>8</id> <title>Java Constructors</title> <artist>Darker</artist> <duration>55:16</duration> <thumb_url>http://www.iitbox.com/admin/java_cons.jpg</thumb_url> </content> <content> <id>9</id> <title>Java this Pointer</title> <artist>Darker</artist> <duration>01:02:23</duration> <thumb_url>http://www.iitbox.com/admin/java_this.jpg</thumb_url> </content> <content> <id>10</id> <title>Java Class Method</title> <artist>Darker</artist> <duration>01:09:08</duration> <thumb_url>http://www.iitbox.com/admin/java_class.jpg</thumb_url> </content> <content> <id>11</id> <title>Java Modifier, Override</title> <artist>Darker</artist> <duration>01:08:10</duration> <thumb_url>http://www.iitbox.com/admin/java_override.jpg</thumb_url> </content> <content> <id>12</id> <title>Java Polymorphism</title> <artist>Darker</artist> <duration>37:46</duration> <thumb_url>http://www.iitbox.com/admin/java_poly.jpg</thumb_url> </content> <content> <id>13</id> <title>Java abstract class and interface</title> <artist>Darker</artist> <duration>44:41</duration> <thumb_url>http://www.iitbox.com/admin/java_interface.jpg</thumb_url> </content> <content> <id>14</id> <title>Java final</title> <artist>Darker</artist> <duration>01:13:30</duration> <thumb_url>http://www.iitbox.com/admin/java_final.jpg</thumb_url> </content> <content> <id>15</id> <title>Some questions</title> <artist>Darker</artist> <duration>01:08:00</duration> <thumb_url>http://www.iitbox.com/admin/java_questions.jpg</thumb_url> </content> <content> <id>16</id> <title>Java array</title> <artist>Darker</artist> <duration>56:44</duration> <thumb_url>http://www.iitbox.com/admin/java_array.jpg</thumb_url> </content> <content> <id>17</id> <title>Java Multidimensional array</title> <artist>Darker</artist> <duration>56:44</duration> <thumb_url>http://www.iitbox.com/admin/java_dimensional.jpg</thumb_url> </content> <content> <id>18</id> <title>Java Bit operation</title> <artist>Darker</artist> <duration>43:27</duration> <thumb_url>http://www.iitbox.com/admin/java_bit.jpg</thumb_url> </content> <content> <id>19</id> <title>Java-Assemble(one)</title> <artist>Darker</artist> <duration>44:30</duration> <thumb_url>http://www.iitbox.com/admin/java_set_1.jpg</thumb_url> </content> <content> <id>20</id> <title>Java-Assemble(two)</title> <artist>Darker</artist> <duration>53:41</duration> <thumb_url>http://www.iitbox.com/admin/java_set_2.jpg</thumb_url> </content> <content> <id>21</id> <title>Java-Assemble(three)</title> <artist>Darker</artist> <duration>43:36</duration> <thumb_url>http://www.iitbox.com/admin/java_set_3.jpg</thumb_url> </content> <content> <id>22</id> <title>Java-Assemble(four)</title> <artist>Darker</artist> <duration>10:29</duration> <thumb_url>http://www.iitbox.com/admin/java_set_4.jpg</thumb_url> </content> <content> <id>23</id> <title>Java-Generic</title> <artist>Darker</artist> <duration>50:42</duration> <thumb_url>http://www.iitbox.com/admin/java_generic_1.jpg</thumb_url> </content> <content> <id>24</id> <title>Java-Expection</title> <artist>Darker</artist> <duration>44:48</duration> <thumb_url>http://www.iitbox.com/admin/java_expection.jpg</thumb_url> </content> <content> <id>25</id> <title>Some questions</title> <artist>Darker</artist> <duration>48:22</duration> <thumb_url>http://www.iitbox.com/admin/java_que.jpg</thumb_url> </content> <content> <id>26</id> <title>Java Graphics(one)</title> <artist>Darker</artist> <duration>51:36</duration> <thumb_url>http://www.iitbox.com/admin/java_graphics.jpg</thumb_url> </content> <content> <id>27</id> <title>Java Graphics(two)</title> <artist>Darker</artist> <duration>47:53</duration> <thumb_url>http://www.iitbox.com/java_graphics.jpg</thumb_url> </content> <content> <id>28</id> <title>Java Event Handling(one)</title> <artist>Darker</artist> <duration>01:09:42</duration> <thumb_url>http://www.iitbox.com/admin/java_event.jpg</thumb_url> </content> <content> <id>29</id> <title>Java Event Handling(two)</title> <artist>Darker</artist> <duration>53:39</duration> <thumb_url>http://www.iitbox.com/admin/java_event.jpg</thumb_url> </content> <content> <id>30</id> <title>Java Event Summary</title> <artist>Darker</artist> <duration>53:58</duration> <thumb_url>http://www.iitbox.com/admin/java_enent.jpg</thumb_url> </content> <content> <id>31</id> <title>Java Thread(one)</title> <artist>Darker</artist> <duration>47:51</duration> <thumb_url>http://www.iitbox.com/admin/java_thread.jpg</thumb_url> </content> <content> <id>32</id> <title>Java Thread(two)</title> <artist>Darker</artist> <duration>57:06</duration> <thumb_url>http://www.iitbox.com/admin/java_thread_1.jpg</thumb_url> </content> <content> <id>33</id> <title>Java Thread(three)</title> <artist>Darker</artist> <duration>50:27</duration> <thumb_url>http://www.iitbox.com/admin/java_thread_2.jpg</thumb_url> </content> <content> <id>34</id> <title>Summary(one)</title> <artist>Darker</artist> <duration>55:32</duration> <thumb_url>http://www.iitbox.com/admin/java_sum.jpg</thumb_url> </content> <content> <id>35</id> <title>Summary(two)</title> <artist>Darker</artist> <duration>01:29:00</duration> <thumb_url>http://www.iitbox.com/admin/java_sum.jpg</thumb_url> </content> <content> <id>36</id> <title>Java-io(one)</title> <artist>Darker</artist> <duration>48:34</duration> <thumb_url>http://www.iitbox.com/admin/java_io_1.jpg</thumb_url> </content> <content> <id>37</id> <title>Java-io(two)</title> <artist>Darker</artist> <duration>53:34</duration> <thumb_url>http://www.iitbox.com/admin/java_io_2.jpg</thumb_url> </content> <content> <id>38</id> <title>Java-io(three)</title> <artist>Darker</artist> <duration>49:35</duration> <thumb_url>http://www.iitbox.com/admin/java_io_3.jpg</thumb_url> </content> <content> <id>39</id> <title>Java-io(four)</title> <artist>Darker</artist> <duration>43:35</duration> <thumb_url>http://www.iitbox.com/admin/java_io_4.jpg</thumb_url> </content> <content> <id>40</id> <title>Summary(one)</title> <artist>Darker</artist> <duration>58:47</duration> <thumb_url>http://www.iitbox.com/admin/java_sum.jpg</thumb_url> </content> <content> <id>41</id> <title>Summary(two)</title> <artist>Darker</artist> <duration>47:56</duration> <thumb_url>http://www.iitbox.com/admin/java_sum.jpg</thumb_url> </content> <content> <id>42</id> <title>Summary(three)</title> <artist>Darker</artist> <duration>01:30:32</duration> <thumb_url>http://www.iitbox.com/admin/java_sum.jpg</thumb_url> </content> <content> <id>43</id> <title>Summary(four)</title> <artist>Darker</artist> <duration>11:51</duration> <thumb_url>http://www.iitbox.com/admin/java_sum.jpg</thumb_url> </content> <content> <id>44</id> <title>Some Questions</title> <artist>Darker</artist> <duration>36:17</duration> <thumb_url>http://www.iitbox.com/admin/java_que.jpg</thumb_url> </content> <content> <id>45</id> <title>Some Questions</title> <artist>Darker</artist> <duration>01:19:54</duration> <thumb_url>http://www.iitbox.com/admin/java_que.jpg</thumb_url> </content> <content> <id>46</id> <title>Java Web</title> <artist>Darker</artist> <duration>01:07:26</duration> <thumb_url>http://www.iitbox.com/admin/java_web.jpg</thumb_url> </content> <content> <id>47</id> <title>Java port.url.socket</title> <artist>Darker</artist> <duration>56:32</duration> <thumb_url>http://www.iitbox.com/admin/java_port.jpg</thumb_url> </content> </basic>
我們可以看到文檔中包含了一些文字數據和圖片的url...但是有了xml文檔是僅僅不夠的,我們如果想把它展示成Android的列表項的話,我們需要對這個XML文檔進行解析,獲取其中每一個節點值...然后把所有的節點值放置到每一個列表項上,通過動態加載的方式可以實現所有的樣式都會展示在屏幕之上...那么如何解析XML文檔呢?這里就需要使用到DocumentBuilder這個類...通過將XML解析成一顆DOM樹的形式...然后從這顆DOM樹中去獲取每一個節點值...首先我們需要從服務器上獲取到需要的XML文檔...
public String getXmlFromUrl(String url) { String xml = null; try { // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(); //新建HttpClient連接.. HttpPost httpPost = new HttpPost(url); //post方式 HttpResponse httpResponse = httpClient.execute(httpPost);//接收服務器響應信息... HttpEntity httpEntity = httpResponse.getEntity(); //獲取服務器響應后的實體... xml = EntityUtils.toString(httpEntity); //EntityUtils將響應數據轉換成字符串... } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return xml; }
這里的url就是http://www.iitbox.com/admin/java_basic.xml,通過從服務器上獲取到XML文檔...獲取之后我們需要對XML文檔進行解析....下面是解析的過程...這里的解析需要使用到DocumentBuilder這個類...通過DocumentBuilderFactory這個工廠去實例化一個DOM對象...然后獲取到DOM解析器....
public Document getDomElement(String xml){ Document doc = null; //從xml文檔中獲取DOM的解析器... DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //這里調用DOM工廠... try { //從DOM工廠中獲取DOM解析器... DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); //定義一個xml文檔的輸入源.. is.setCharacterStream(new StringReader(xml)); //設置輸入源的字符流... doc = db.parse(is); //指定輸入源的內容解析成一個XML文檔,並返回一個DOM對象... } catch (ParserConfigurationException e) { Log.e("Error: ", e.getMessage()); return null; } catch (SAXException e) { Log.e("Error: ", e.getMessage()); return null; } catch (IOException e) { Log.e("Error: ", e.getMessage()); return null; } return doc; }
我們可以看到,這里先使用了一個工廠模式...這個工廠去調用這樣一個方法....這是api的源碼...我們可以看到最終返回的是一個DocumentBuilderFactory對象...英文中的consult怎么翻譯都覺得不通順...感覺通過這個方法,可以不去使用反射機制迅速的能夠獲取一個class實例...還有一個方法DocumentBuilderFactory newInstance(String,ClassLoader)是調用反射機制的方式獲取class屬性,最后實例化對象...
/** * Returns Android's implementation of {@code DocumentBuilderFactory}. * Unlike other Java implementations, this method does not consult system * properties, property files, or the services API. * * @return a new DocumentBuilderFactory. */ public static DocumentBuilderFactory newInstance() { // instantiate the class directly rather than using reflection return new DocumentBuilderFactoryImpl(); }
然后返回了這個DocumentBuilderFactory對象之后,通過調用newDocumentBuilder()方法...這里可以從源碼得知,通過當前的配置屬性,去實例化一個DocumentBuilder對象...最后就得到了DocumentBuilder屬性了...
/** * Creates a new instance of a {@link javax.xml.parsers.DocumentBuilder} * using the currently configured parameters. * * @exception ParserConfigurationException if a DocumentBuilder * cannot be created which satisfies the configuration requested. * @return A new instance of a DocumentBuilder. */ public abstract DocumentBuilder newDocumentBuilder() throws ParserConfigurationException;
通過上面的方式我們就拿到了DOM的解析器...拿到了解析器之后,設置其輸入源,最后會返回給我們一個解析了XML文檔之后的一個DOM對象了...這個DOM對象就是一顆DOM樹...它將XML文檔中的元素以節點的形式形成了一種樹狀結構...干脆上一張圖片給大家看看...
這就是上面XML文檔解析之后從而形成的一顆DOM樹狀結構...每一個方框都代表着一個元素...也是一個節點...XML被解析成這樣的格式...我們通過一些方法就能夠從這顆DOM樹上獲取節點對應的數據信息了...獲取數據信息的方式需要使用到NodeList... NodeList其實就是通過DOM樹上的每一個節點去獲取節點,對節點進行遍歷操作,從而獲取到數據...在這里我不進行細細的介紹NodeList了...是一個非常容易理解的過程..很簡單...我提供了一個代碼方便大家去理解....
源碼下載:http://files.cnblogs.com/files/RGogoing/sajhkl.zip