android之dom解析xml

來源:互聯網
上載者:User

好吧,我們還是來實現這張圖的效果,只不過技術我們改為了dom,至於這裡的圖片上為什麼顯示的是sax解析,我只能說,哎,沒辦法,我想偷懶啊。嘿嘿……再看代碼結構圖:

main.xml

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /><TextView<br /> android:layout_width="fill_parent"<br /> android:layout_height="wrap_content"<br /> android:id="@+id/textView"<br /> /><br /></LinearLayout><br />

beauties.xml

<?xml version="1.0" encoding="UTF-8"?><br /><beauties><br /><beauty><br /><name>林志玲</name><br /><age>28</age><br /></beauty><br /><beauty><br /><name>楊冪</name><br /><age>23</age><br /></beauty></p><p></beauties><br />

activity的代碼:

package cn.com.dom;</p><p>import java.io.InputStream;<br />import java.util.ArrayList;</p><p>import javax.xml.parsers.DocumentBuilder;<br />import javax.xml.parsers.DocumentBuilderFactory;</p><p>import org.w3c.dom.Document;<br />import org.w3c.dom.Element;<br />import org.w3c.dom.Node;<br />import org.w3c.dom.NodeList;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.Log;<br />import android.widget.TextView;</p><p>/**<br /> *<br /> * @author chenzheng_java<br /> * @description 使用dom解析xml<br /> * @since 2011/03/04<br /> *<br /> */<br />public class DomParseXmlTest extends Activity {<br />// 儲存最終在前台顯示的內容<br />private String result = "";</p><p>@Override<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.main);</p><p>InputStream inputStream = this.getClassLoader().getResourceAsStream(<br />"beauties.xml");<br />try {<br />DocumentBuilderFactory factory = DocumentBuilderFactory<br />.newInstance();<br />DocumentBuilder builder = factory.newDocumentBuilder();<br />Document document = builder.parse(inputStream);<br />// 擷取根節點<br />Element root = document.getDocumentElement();</p><p>parse(root);</p><p>for (Beauty b : beautyList) {<br />result += b.toString();<br />}</p><p>TextView textView = (TextView) findViewById(R.id.textView);<br />textView.setText(result);</p><p>} catch (Exception e) {<br />e.printStackTrace();<br />}</p><p>}</p><p>private Beauty beauty = null;<br />private ArrayList<Beauty> beautyList = new ArrayList<Beauty>();</p><p>/**<br /> *<br /> * @param element 將要進行遍曆的節點<br /> */<br />private void parse(Element element) {<br />NodeList nodelist = element.getChildNodes();<br />int size = nodelist.getLength();<br />for (int i = 0; i < size; i++) {<br />// 擷取特定位置的node<br />Node element2 = (Node) nodelist.item(i);<br />/* getNodeName擷取tagName,例如<book>thinking in android</book>這個Element的getNodeName返回book<br /> * getNodeType返回當前節點的確切類型,如Element、Attr、Text等<br /> * getNodeValue 返回節點內容,如果當前為Text節點,則返迴文本內容;否則會返回null<br /> * getTextContent 返回當前節點以及其子代節點的文本字串,這些字串會拼成一個字串給使用者返回。例如<br /> * 對<book><name>thinking in android</name><price>12.23</price></book>調用此方法,則會返回“thinking in android12.23”<br /> */<br />String tagName = element2.getNodeName();<br />if (tagName.equals("beauty")<br />&& element2.getNodeType() == Document.ELEMENT_NODE) {<br />beauty = new Beauty();<br />Log.i("通知:", "建立beauty");<br />if (element2.getNodeType() == Document.ELEMENT_NODE) {<br />parse((Element) element2);<br />}<br />Log.i("通知:", "添加beauty");<br />beautyList.add(beauty);</p><p>}</p><p>if (tagName.equals("name")) {<br />String name = element2.getTextContent();<br />Log.i("通知:", "name" + name);<br />beauty.setName(name);</p><p>}<br />if (tagName.equals("age")) {<br />String age = element2.getTextContent();<br />Log.i("通知:", "age" + age);<br />beauty.setAge(age);</p><p>}</p><p>}</p><p>}</p><p>/**<br /> *<br /> * @author chenzheng_java 這裡使用內部類是為了效率考慮,內部類要比單獨頂一個bean類更加的高效以及節約空間<br /> *<br /> */<br />private class Beauty {<br />String name;<br />String age;</p><p>public String getName() {<br />return name;<br />}</p><p>public void setName(String name) {<br />this.name = name;<br />}</p><p>public String getAge() {<br />return age;<br />}</p><p>public void setAge(String age) {<br />this.age = age;<br />}</p><p>@Override<br />public String toString() {<br />return "美女資料 [年齡=" + age + ", 姓名=" + name + "]";<br />}</p><p>}<br />}

其他都為預設。執行,然後就可以看到正確的結果了

----------------------------------------------------------------------------------

寫部落格的時候,不總結幾句廢話的孩子不是好孩子。所以,我決定還是說幾句:

DOM解析雖然我們在android中並不推薦使用,但是這並不代表著不可以實現。dom的原理是把xml檔案的各種部分都看成是節點,所有的節點因為層級關係最後形成了一顆節點樹。而DOM的解析方式便是在記憶體中生存這棵樹,並允許使用者進行相關的操作。

      這裡列出幾個dom中經常用到的方法

Node 介面的常用方法
一個節點可以調用
short getNodeType()
方法返回一個表示節點類型的常量(Node介面規定的常量值),例如,對於Element節點,getNodeType()方法返回的值為:
Node.ELEMENT_NODE
節點可以調用
NodeList  getChildNodes()
返回一個由當前節點的所有子節點組成的NodeList對象。節點調用
Node  getFirstChild()
返回當前節點的第一個子節點。節點調用
Node  getLastChild()
返回當前節點的最後一個子節點。節點可以調用
NodeList  getTextContent()
返回當前節點及所有子孫節點中的常值內容。

還有其他的很多很多方法,我們可以通過api來詳細瞭解。因為這裡主要是為了學習android,所以關於dom稍微瞭解下就可以了。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.