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文檔,記憶體消耗大,所以使用較少。