一、解析mybatis的配置文件

1、加载指定资源路径下的配置文件的方法

    (1)Class.getResourceAsStream(resource)         resource = "config.xml"

        用法如下:你在包com.test.mycode写了一个MyTest类,那么我们可以使用MyTest.class.getResourceAsStream(resource)或Class.class.getResourceAsStream(resource)

             此处需要注意:如果资源路径 resource 以 / 开头,那么就会从classpath的根路径下开始查找,即config.xml放在src/main/resources下面也可以被成功加载;

                                      如果资源路径 resource 没有以 / 开头,那么就会从当前类MyTest所在的包com.test.mycode下查找相应的资源,即config.xml必须放在com.test.mycode包下面才能被成功加载

 (2)ClassLoader.getResourceAsStream(resource)         resource = "config.xml"     注意要查找的资源前面不要带/,会从classpath的根路径下查找

 

2、DOM解析

class.xml 文件如下    启动定义了java.dtd文件的相对位置  <!DOCTYPE classes SYSTEM "bin//parsers//java.dtd">

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE classes SYSTEM "bin//parsers//java.dtd">
<classes>
  <java班 name="CSDNJava01班">
    <teachers>
      <teacher name="军哥" sex="男" age="28" />
      <teacher name="刘丽华" sex="女" age="28" />
    </teachers>
    <students>
      <student id="x121">
        <name>王亮</name>
        <sex>女</sex>
        <age>28</age>
      </student>
    </students>
  </java班>
  <!-- 注释0 -->
  <net班 name="CSDNNet01班">xxx</net班>
  <php班 name="CSDNPhp01班"></php班>
  <ios班 name="CSDNIos01班"></ios班>
</classes>

java.dtd文件如下

<!ELEMENT classes (java班,net班,php班,ios班)>
<!ELEMENT java班 (teachers?,students?)>
<!ELEMENT net班 (teachers?,students?)>
<!ELEMENT php班 (teachers?,students?)>
<!ELEMENT ios班 (teachers?,students?)>
<!ELEMENT teachers (teacher*)>
<!ELEMENT teacher EMPTY>
<!ELEMENT students (student*)>
<!ELEMENT student (name,sex,age)>
<!ATTLIST java班 name CDATA #IMPLIED>
<!ATTLIST net班 name CDATA #IMPLIED>
<!ATTLIST php班 name CDATA #IMPLIED>
<!ATTLIST ios班 name CDATA #IMPLIED>
<!ATTLIST teacher name CDATA #IMPLIED>
<!ATTLIST teacher sex CDATA #IMPLIED>
<!ATTLIST teacher age CDATA #IMPLIED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student id ID #IMPLIED>

 

DOM解析代码如下

import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomParserTest {

  public static void main(String[] args) throws Exception {
    //调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    //调用工厂对象的newDocumentBuilder方法得到DOM解析器对象
    DocumentBuilder builder = builderFactory.newDocumentBuilder();
    InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("class.xml");
    Document document = builder.parse(inputStream);
    Element root = document.getDocumentElement();
    //遍历根节点下面的所有子节点
    listNodes(root);
  }

  private static void listNodes(Node node) {
    //节点是什么类型的节点
    if(node.getNodeType() == Node.ELEMENT_NODE) {
      Element element = (Element)node;
      //判断此元素节点是否有属性
      if(element.hasAttributes()) {
        //获取属性节点的集合
        NamedNodeMap map = element.getAttributes();
        //遍历属性节点的集合
        for(int k=0; k<map.getLength(); k++) {
          //获取具体的某个属性节点
          Attr attr = (Attr) map.item(k);
          System.out.println("name:::" + attr.getNodeName() + " value::" + attr.getNodeValue() + " type::" + attr.getNodeType());
        }
      }  
      //获取元素节点的所有孩子节点
      NodeList nodeList = element.getChildNodes();
      //遍历
      for(int j=0; j < nodeList.getLength(); j++) {
        //得到某个具体的节点对象
        Node nd = nodeList.item(j);
        System.out.println("name::" + nd.getNodeName() + " value:::" + nd.getNodeValue() + " type:::" + nd.getNodeType());
        //再次进入遍历节点的迭代
        listNodes(nd);
      }

    }
  }
}

posted @ 2018-06-30 15:53  将王相  阅读(145)  评论(0)    收藏  举报