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.获取结果
5.但是在实际工作中,我们并不是只是生成系列的东东来证明我们已经访问到了,我们需要使用实际的类用反射技术来生成对象,所以将上面的代码修改,并添加新的类,这里我就以代理模式为例,实现一下,代码如下:
【本节内容在下星期考试之后再做添加】