1.我们在写代码时,为了方便代码的修改,使其符合开闭原则等设计原则,经常会使用用到Java读取xml文件,但是该怎么读取配置文件呢?下面看我提供的一个例子

2.有如下的xml文件

<?xml version="1.0"?>
<pets>  
    <dogs>  
        <dog id="1">            
            <name>YAYA</name>  
            <health>100</health>  
            <love>0</love>  
            <strain>酷酷的雪娜瑞</strain>  
        </dog>  
        <dog id="2">            
            <name>OUOU</name>  
            <health>90</health>  
            <love>15</love>  
            <strain>聪明的拉布拉多犬</strain>  
        </dog>  
    </dogs>  
    <penguins>  
        <penguin id="3">            
            <name>QQ</name>  
            <health>100</health>  
            <love>20</love>  
            <sex>Q仔</sex>             
        </penguin>          
    </penguins>  
</pets>
关于xml文件格式,这里我不再做介绍了,需要扩展知识的同志们可以去XML论坛逛一逛,或者上w3school看看。

 

3.我们看到,这里有一个根节点<pets></pets>,并且他有两个子节点,分别是<dog></dog>和<penguins></penguins>,在<dog></dog>中有一个属性Attribute,叫做id,其值为1;有四个子节点分别为<name><health><love><strain>。下面有下面我们来写读取XML文件的java代码。

package liu.shen.util;

import javax.xml.parsers.*;  
import org.w3c.dom.*;  
import org.xml.sax.*;  
  
public class ReadXMlFile 
{  
    public static void main(String[] args)  
    {  
    	/*1.使用Factory模式来生产DocumentBuilder对象,这里面有一个静态方法叫做newinstance()*/
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
        
        try  
        {  
            DocumentBuilder db = dbf.newDocumentBuilder(); 
            
            /*1.Document是一个继承自Node的接口
             * 2.db.parse()方法返回的是一个文档模型
             * */
            Document doc = db.parse("config.xml");
            
            /*1.获取所有的TagName为dog的节点,并把他们放到集合dogList中
             * 2.NodeList是一个接口
             */                      
            NodeList dogList = doc.getElementsByTagName("dog");
            
            /*
             * 1.集合dogList的节点数dogList.getLength();
             * */
            System.out.println("共有" + dogList.getLength() + "个dog节点");           
            
            
	        for (int i = 0; i < dogList.getLength(); i++)
	        {  
	            Node dog = dogList.item(i);//按照循环找出所有的节点
	          
	            /*
	             * 1.The Element interface represents an element in an HTML or XML 
	             * document. Elements may have attributes associated with them
	             * */
	            Element elem = (Element) dog;//这里为啥非要有一个Element?
	            
	            /*1.获取属性值id
	             * 2.获取属性值location
	             * */
	            System.out.println("id:" + elem.getAttribute("id")+",location:"+elem.getAttribute("location"));
	            
	            
	            /*
	             * 1.getNextSibling()为当前的的节点的下一个节点
	             * */
	            for (Node node = dog.getFirstChild(); node != null; node = node.getNextSibling())  
	            {
	                if (node.getNodeType() == Node.ELEMENT_NODE)//判断是否是ELEMENT型NODE  
	                {  
	                	/*
	                	 * 1.getNodeName()获取节点名
	                	 * 2.这里应该是将文本也作为一个子节点来处理
	                	 * */
	                    String name = node.getNodeName();  
	                    String value = node.getFirstChild().getNodeValue();
	                    System.out.print(name + ":" + value + "\t");  
	                 }  
	             }  
	             System.out.println();  
	         }  
        }
        catch (Exception e)  
        {  
            e.printStackTrace();  
        }  
    }  
}  
4.获取结果

 

java读取XML文件_Java

5.但是在实际工作中,我们并不是只是生成系列的东东来证明我们已经访问到了,我们需要使用实际的类用反射技术来生成对象,所以将上面的代码修改,并添加新的类,这里我就以代理模式为例,实现一下,代码如下:

【本节内容在下星期考试之后再做添加】