沿用上一章Android SAX解析XML里面的XMl和Product.java类,这里我们使用DOM去解析XML文件。
package com.dom.xml; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.sax.xml.Product; public class DOMParserXML { public static List<Product> parseXml(InputStream is){ List<Product> products = new ArrayList<Product>(); Product product = null; try { //得到Dom解析对象工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //通过工程创建Dom解析对象实例 DocumentBuilder builder = factory.newDocumentBuilder(); //将xml文件的输入流交给Dom解析对象进行解析,并将Dom树返回 Document document = builder.parse(is); //通过Dom树接收到根元素 Element rootElement = document.getDocumentElement(); //通过根元素获得下属的所有名字为product节点 NodeList nodeList = rootElement.getElementsByTagName("product"); int count = nodeList.getLength(); //遍历取出的product节点集合 for (int i = 0; i < count; i++) { //得到一个product节点 Element productElement = (Element)nodeList.item(i); //新建一个Product对象 product = new Product(); //得到product标签的下属所有节点 NodeList productChildList = productElement.getChildNodes(); int size = productChildList.getLength(); //循环得到的下属标签 for (int j = 0; j < size; j++) { //创建一个引用,指向循环的标签 Node node = productChildList.item(j); //如果此循环出来的元素时Element对象,即标签元素 if (Node.ELEMENT_NODE == node.getNodeType()) { //如果这个标签的名字是id,那么得到它的值,赋值给Product对象 if ("id".equals(node.getNodeName())) { int id = Integer.parseInt(node.getFirstChild().getNodeValue()); product.setId(id); } if ("name".equals(node.getNodeName())) { String name = node.getFirstChild().getNodeValue(); product.setName(name); } if ("price".equals(node.getNodeName())) { float price = Float.parseFloat(node.getFirstChild().getNodeValue()); product.setPrice(price); } } } //将此product对象添加到products中 products.add(product); //将product制空 product = null; } } catch (Exception e) { // TODO: handle exception } //返回xml解析后得到的对象集合 return products; } }
解析后的结果如下: