• 个人学习笔记之DOM解析XML文件


    昨天晚上发了一篇用SAX解析XML文件的博客,有兴趣的可以去看下,今天我用的DOM解析,DOM比SAX更容易掌握,因为她没有涉及回调和复杂的状态管理,然而,DOM的实现常常将所有的XML节点保存在内存中,这样使的处理较大的文档效率低。

    XML基本的节点类型

    node - DOM基本的数据类型

    Element - 最主要处理的对象是Element

    Attr - 元素的属性

    Text - 一个Element 或者Attr的实际内容

    Document - 代表整个XML文档,一个Document对象通常也称为一颗DOM树

    1.在src目录下新建一个android.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <persons>
        <person id="23">
            <name>xiaanming</name>
            <age>23</age>
        </person>
        <person id="20">
            <name>liudehua</name>
            <age>28</age>
        </person>
    </persons>


    2.新建一个Person对象来存放解析的内容

    package com.example.dom_parser;
    
    public class Person {
    	private int id;
    	private String name;
    	private int age;
    	
    	public Person(){}
    	
    	public Person(int id, String name, int age){
    		this.id = id;
    		this.name = name;
    		this.age = age;
    	}
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    	
    	@Override
    	public String toString() {
    		return "id = " + id + ", name = " + name + ", age = " + age;
    	}
    	
    }
    

    3 新建一个DomPersonService.class,注释我写的清楚,大家自己看

    package com.example.dom_parser;
    
    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 android.util.Log;
    
    
    public class DomPersonService {
    	
    	
    	public static List<Person> readXML() throws Throwable{
    		//获得android.xml文件的输入流
    		InputStream is = MainActivity.class.getClassLoader().getResourceAsStream("android.xml");
    		List<Person> persons = new ArrayList<Person>();
    		
    		//实例化DocumentBuilderFactory和DocumentBuilder,并创建Document
    		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    		DocumentBuilder builder = factory.newDocumentBuilder();
    		Document document = builder.parse(is);
    		
    		//返回文档的根(root)元素
    		Element rootElement =  document.getDocumentElement();
    		
    		//获取一个Note(DOM基本的数据类型)集合,这里有两个person Note
    		NodeList nodes = rootElement.getElementsByTagName("person");
    		
    		//遍历Note集合
    		for(int i=0; i<nodes.getLength(); i++){
    			//先从第一个person元素开始解析
    			Element personElement = (Element) nodes.item(i);
    			Person person = new Person();
    			person.setId(Integer.valueOf(personElement.getAttribute("id")));
    			
    			//获取person下面的name 和 age 的Note集合
    			NodeList chileNodes = personElement.getChildNodes();
    			for(int y=0; y<chileNodes.getLength(); y++){
    				Node childNode = chileNodes.item(y);
    				
    				//判断子Note的类型为元素Note
    				if(childNode.getNodeType() == Node.ELEMENT_NODE){
    					Element childElement = (Element) childNode;
    				if("name".equals(childElement.getNodeName())){
    					person.setName(childElement.getFirstChild().getNodeValue());
    				}else if("age".equals(childElement.getNodeName())){
    					person.setAge(Integer.valueOf(childElement.getFirstChild().getNodeValue()));
    				}
    				}
    			}
    			
    			Log.e("log", person.toString());
    			
    			persons.add(person);
    		}
    		
    		return persons;
    		
    	}
    }
    

    关于DOM解析XML,我们要清楚的知道个节点之间的关系,才能更好的操作对象树,值得注意的是在建立Element时,要注意jar包的导入, 要选择org.w3c.dom.Element,而不是其他的包,好了,今天就到这里,洗澡睡觉去,明天还要上班

  • 相关阅读:
    php 获取机器名
    php缓存参数祥解
    ajax参数祥解
    php 正则匹配返回字符串
    TP5验证规则使用
    J
    j
    virtualBox 桥接网卡 未指定
    Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
    Spring Cloud Alibaba基础教程:使用Nacos作为配置中心
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3085770.html
Copyright © 2020-2023  润新知