Android下Xml解析技術(二)、DOM解析Xml檔案

來源:互聯網
上載者:User

DOM(Document Object Model文件物件模型)方式。

DOM方式解析XML的過程為首先將所有 XML 文檔讀取到記憶體中,構造一個樹結構,然後允許使用 DOM API 來操作整個樹結構,包括遍曆 XML 樹、檢索所需的資料等。

Android平台使用Java SDK中的API來實現DOM方式的解析,具體的方法和之前學習的使用Java SDK中的SAX方式解析XML類似,因此有了前面SAX的基礎,學習DOM方式就會比較簡單了。DOM 和 之前的SAX 的主要差別是 API 本身的結構,SAX 由基於事件的回調集組成,邊解析邊產生事件從而呼叫事件處理器的回呼函數進行處理。而DOM不是,DOM直接讀取整個XML樹儲存為Document類,因此只需處理儲存在記憶體中的Document對象即可,沒有回呼函數。

DOM解析相關的包為javax.xml.parsers和org.w3c.dom。其中javax.xml.parsers提供Document構造器工廠DocumentBuilderFactory和Document構造器DocumentBuilder,DocumentBuilderFactory執行個體調用newDocumentBuilder()建立構造器DocumentBuilder執行個體,然後該執行個體就可以調用parse方法來返回一個解析為Document類的執行個體。Document
類由表示XML文檔的包含元素、屬性、常值內容等的各個節點群組成。因此有了Document對象後就可以按需要擷取xml文檔中各個子節點及其相關的值了。Document、Element、Node等各個和DOM相關的具體部分都在org.w3c.dom包中,因此和SAX類似,org.w3c.dom包是底層具體的負責DOM解析相關的內容,並且為上層javax.xml.parsers包提供DOM解析器等相關調用。

DOM解析過程:

1、構造DocumentBuilder解析器

2、傳入xml檔案輸入資料流,解析xml檔案,返迴文檔對象

3、根據文檔對象,從記憶體中檢索資料。

下面依舊解析這個簡單的xml檔案 test.xml

<?xml version="1.0" encoding="UTF-8"?><persons><person id="1"><name>Lucy</name><age>15</age></person><person id="2"><name>Tim</name><age>20</age></person></persons>

public void domParseXml() throws ParserConfigurationException, SAXException, IOException {// 構造DocumentBuilder解析器DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();DocumentBuilder dBuilder = builderFactory.newDocumentBuilder();                // 獲得xml檔案的輸入資料流,獲得文檔對象InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");Document document = dBuilder.parse(inputStream);               // 解析完成,根據document從記憶體中檢索資料Element root = document.getDocumentElement();// 擷取文檔根節點(xml檔案只允許一個根節點)NodeList personsNode = root.getElementsByTagName("person");// 取得所有person節點的列表// NodeList personsNode=root.getChildNodes();上一步取得person節點,不能這個方法,是因為子節點包括元素節點和文本節點,如果用這個方法,還要判斷取得的節點的類型List<Person> persons=new ArrayList<Person>();for (int i = 0; i < personsNode.getLength(); i++) {Person person=new Person();Element personElement = (Element) personsNode.item(i);//開始解析取得的person節點int id = new Integer(personElement.getAttribute("id"));//取得person節點的屬性 idperson.setId(id);NodeList childsNode = personElement.getChildNodes(); //取得person節點的所有子節點for (int j = 0; j < childsNode.getLength(); j++) {if (childsNode.item(j).getNodeType() == Node.ELEMENT_NODE) {//如果子節點是元素節點Element childElement = (Element) childsNode.item(j);//取得這個元素節點if (childElement.getNodeName().equals("name")) {//判斷是哪一個元素節點person.setName(childElement.getFirstChild().getNodeValue());//獲得元素節點的第一個子節點的值}if (childElement.getNodeName().equals("age")) {person.setAge(new Integer(childElement.getFirstChild().getNodeValue()));}}}persons.add(person);person=null;}for (Person p : persons) {System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge());}}

DOM解析技術雖然比較直觀,但是需要裝在真箇xml文檔,記憶體消耗大,所以使用較少。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.