import java.util.*;
import javax.xml.parsers.*;
import java.io.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.*;
import org.w3c.dom.*;
/*
* 定义了读取了配置文件的具体类
* 抽象类DocumentBuilderFactory定义工厂 API,使应用程序能够从 XML 文档获取生成 DOM 对象树的解析器
* 抽象类DocumentBuilder定义 API, 使其从 XML 文档获取 DOM 文档实例,使用此类,应用程序员可以从 XML 获取一个 Document
* 接口DocumentDocument 接口表示整个 HTML 或 XML 文档。从概念上讲,它是文档树的根,并提供对文档数据的基本访问。
* 因为元素、文本节点、注释、处理指令等不能存在于 Document 的上下文之外,所以 Document 接口还包含所需的创建这些对象的工厂方法。
* public interface Element extends Node, Element 接口表示 HTML 或 XML 文档中的一个元素。
*/
public class Configuration
{
public static Hashtable Attrribute(String configname, String mostlyelem,
String childmostlyelem) throws Exception
{
Hashtable hs = new Hashtable();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
/*
* parse(String uri) 将给定 URI 的内容解析为一个 XML 文档,并且返回一个新的 DOM Document 对象
*/
Document doc = builder.parse(configname);
Element root = doc.getDocumentElement();
NodeList elemList = root.getElementsByTagName(mostlyelem);
/*
* 第一重循环是从获取的根节点beans中遍历其所有子节点,
* 而每个子节点对应的就是一个bean配置
* 第二重循环是从bean中获取bean的配置
*/
for(int i = 0; i < elemList.getLength(); i++)
{
NamedNodeMap ac = elemList.item(i).getAttributes();
Hashtable hs1 = new Hashtable();
/*
* 通过key为“class”和读取配置文件中具体类class的路径存储在哈希表中
*/
hs1.put("class", ac.getNamedItem("class").getNodeValue());
Element node = (Element)elemList.item(i);
/*
* NodeList 接口提供对节点的有序集合的抽象,没有定义或约束如何实现此集合
* NodeList 中的项可以通过从 0 开始的整数索引进行访问
*/
NodeList elemList1 = node.getElementsByTagName(childmostlyelem);
for(int j = 0; j < elemList1.getLength(); j++)
{
/*
* interface NamedNodeMap 实现 NamedNodeMap 接口的对象用于表示可以通过名称访问的节点的集合。
* 注意,NamedNodeMap 不从 NodeList 继承;不以任何特定的顺序维护 NamedNodeMaps
*/
/*
* 获取bean配置的所有属性值,即是类NamedNodeMap实例ac1
*/
NamedNodeMap ac1 = elemList1.item(j).getAttributes();
/*
* Node getNamedItem(String name) 检索通过名称指定的节点
*/
/*
* String getNodeValue() 此节点的值,取决于其类型
* key就是在配置文件节点property中name对应的值,而该值是配置文件中指定的属性名
*/
String key = ac1.getNamedItem("name").getNodeValue();
/*
* 通过root(配置文件中的beans)遍历所有子节点,
* 每次的ac对应配置文件中的一个bean配置
* 而ac1中对应的则是bean节点下的子节点property的所有属性
* NodeList getElementsByTagName(String name) 以文档顺序返回具有给定标记名称的所有后代 Elements 的 NodeList
* 即是获取了每个property节点下的所有value节点
* 并读取第一个valu节点的值到value中
*/
NodeList node1 = ((Element)elemList1.item(j)).getElementsByTagName("value");
String value = node1.item(0).getFirstChild().getNodeValue();
/*
* 在哈希表中
* key就是在配置文件节点property中name对应的值,而该值是配置文件中指定的属性名
* 第一个valu节点的值到value中
* 将其对应存储在哈希表hs1中
*/
hs1.put(key, value);
}
/*
* 每一次的第二重循环结束,则把一个bean配置的信息按照属性名为key,属性值为value存储在一个哈希表中
* 而在外循环一次结束时则把bean中的属性指定的类id为key,内循环获得的哈希表hs1为value
* 存储在另一个哈希表hs中,从而实现了一个bean id对应一个类的配置的属性信息
*/
hs.put(ac.getNamedItem("id").getNodeValue(), hs1);
}
return hs;
}
}
评论1
最新资源