DOM解析XML

来源:互联网 发布:电脑c盘数据恢复 编辑:程序博客网 时间:2024/06/06 14:13
一、书本内容
DOM解析XML文件时,会将XML文件的所有内容以文档树的方式存放在内存中,然后允许用户使用DOM API遍历XML树、检索所需的数据。使用DOM解析XML的代码看起来是比较直观的,并且在某些方面比基于SAX的实现更加简单。但是,因为DOM需要将XML文件的所有内容以文档树的方式存放在内存中,所以内存消耗比较大,特别是对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX或者PULL来解析XML文件。当然,如果XML文件内容比较小,采用DOM也是可行的。
DOM解析XML文件的基本思路如下:
(1)利用DocumentBuilderFactory创建一个DocumentBuilderFactory实例。
(2)利用DocumentBuilderFactory创建DocumentBuilder。
(3)加载XML文档(Document)。
(4)获取文档的根节点(Element)。
(5)获取根节点中所有子节点的列表(NodeList)。
(6)获取子节点列表中的需要读取的节点。


Node接口的主要方法:
(1)
方法:Short getNodeType()
释义:该方法返回一个节点类型的常量,如对于Element节点,getNodeType()方法返回的值为:Node.ELEMENT_NODE
(2)
方法:NodeList getChildNodes()
释义:返回一个由当前节点的所有子节点组成的NodeList对象
(3)
方法:Node getFirstChild()
释义:返回当前节点的第一个子节点
(4)
方法:Node getLastChild()
释义:返回当前节点的最后一个子节点
(5)
方法:NodeList getTextContent()
释义:返回当前节点及所有子孙节点中的文本内容。


在Android平台下,除了可以对应用程序的私有文件夹中的文件进行操作外,还可以从assets中获得输入流以读取数据。放在应用程序assets目录下的文件,在编译的时候会和其他文件一起被打包。






二、自己项目
1、DOM常用方法
(1)Document.getDocumentElement():返回文档的root根元素
(2)Element/Node.getChildNodes():返回该节点的所有子节点
(3)Element.getElementByTagName(String tag):返回该节点中所有标签为tag的所有子节点
(4)Element.getAttribute(String attrName):返回该节点的指定名称的属性值
(5)Element/Node.getNodeValue()返回该节点的值
(6)Element/Node.getNodeType()返回该节点的类型(元素节点、文本节点)
(7)Element/Node.getNodeName()返回该节点的名字
(8)Element/Node.getTextContent():返回该节点的文本值


2、解析步骤
(1)读入XML文件,将其转化为InputStream(同SAX)
InputStream inputStream=MainActivity.class.getClassLoader().getResourceAsStream("Persons.xml");
(2)利用DOM解析XML文件,获得该XML文件的Document节点
Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream);
(3)从根节点开始解析XML文件
Element root=document.getDocumentElement();


3、项目代码
//MainActivity.java
InputStream inputStream=MainActivity.class.getClassLoader().getResourceAsStream("Persons.xml");ArrayList<Person> persons=MyDOMParser.getList(inputStream);for(int i=0;i<persons.size();i++){Person person=persons.get(i);tv_parse.append("\nid="+person.getId()+";age="+person.getAge()+";name="+person.getName());}






//MyDomParser.java
public class MyDOMParser {static Person person;static ArrayList<Person> persons;static String element;static final String TAG="myDOMParser";public static ArrayList<Person>getList(InputStream inputStream){Document document;persons=new ArrayList<Person>();try {document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(inputStream);Element root=document.getDocumentElement();//根节点personsLog.i(TAG, "解析根节点"+root.getNodeName());NodeList persoNodeList=root.getElementsByTagName("Person");for(int i=0;i<persoNodeList.getLength();i++){Element element=(Element) persoNodeList.item(i);String id=element.getAttribute("id");person=new Person();person.setId(id);Log.i(TAG, "正在解析子节点"+element.getNodeName());NodeList nodeList=element.getChildNodes();for(int j=0;j<nodeList.getLength();j++){Node node=nodeList.item(j);if(node.getNodeType()==Node.ELEMENT_NODE){String nodename=node.getNodeName();if(nodename.equals("name")){Log.i(TAG, "正在解析子节点"+nodename);person.setName(node.getTextContent());}else if(nodename.equals("age")){Log.i(TAG, "正在解析子节点"+nodename);person.setAge(node.getTextContent());}}}persons.add(person);}} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ParserConfigurationException e) {e.printStackTrace();}return persons;}}






//Person.java
public class Person {String id;String name;String age;public Person() {super();id="0";name="王二";age="50";}public Person(String id, String name, String age) {super();this.id = id;this.name = name;this.age = age;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}}





//Persons.xml

<Persons>    <Person id="1">        <name>张三</name>        <age>20</age>    </Person>    <Person id="2">        <name>李四</name>        <age>30</age>    </Person>    <Person id="3">        <name>王五</name>        <age>30</age>    </Person></Persons>



原创粉丝点击