DOM解析XML文件例子

DOM解析XML文件是一次性将目标文件中的所有节点都读入,然后再进行后续操作的方式。

一般分为以下几步:

1. 定义好目标XML文件路径path

2. 实例化DOM解析工厂对象 ,DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(),这种工厂类都不能用new的方式直接产生对象,必须用调用类的newInstance方法来产生对象。

3. 用上面的工厂对象生成DOM解析器对象 ,DocumentBuilder builder = factory.newDocumentBuilder()。

4. 用解析器对象对目标XML文件进行解析,得到Document文件对象 ,Document doc = builder.parse(path)。

5. 处理Document文件,获得XML文件的所有信息。 得到上面的doc对象也就相当于得到了树的根节点,就可以逐步对这可dom树进行遍历获得所有的节点信息,由于树的定义就是递归定义的,所以这里的遍历采用递归的思想最为简单。

代码如下:

首先是目标XML文件

<?xml version="1.0" encoding="utf-8"?>
<student>
  <stu num="1111">
    <name>张三丰</name>
    <sex></sex>
    <cla>武当</cla>
  </stu>
  <stu num="2345">
    <name>小龙女</name>
    <sex></sex>
    <cla>古墓</cla>
  </stu>
</student>

然后是解析的代码:

public class Domparse {
  //用来保存解析出来的学生对象的动态链表
  static ArrayList<Student> list = new ArrayList<Student>();
  static Student stu;
  public static void main(String[] args) throws Exception {
    String path = "D:\\xmlEX\\student2.xml";
    //实例化一个用来产生DOM解析器的工厂对象
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    //使用工厂得到一个DOM解析器对象
    DocumentBuilder builder = factory.newDocumentBuilder();
    //解析指定的xml文件或者数据流买得到DOM对象
    Document doc = builder.parse(path);
    //通过DOM对象获得其中的数据,递归进行遍历
    parseXML(doc);
    for(Student s:list){
      System.out.println(s);
    }
  }
  /**
   * 递归解析XML文件
   * @param doc 
   */
  public static void parseXML(Node doc){
    //获得doc的所有子节点
    NodeList nodes = doc.getChildNodes();
    //遍历所有子节点
    for(int i=0;i<nodes.getLength();i++){
      Node node1 = nodes.item(i);
      //获得节点的名字
      String str = node1.getNodeName();
      //如果这个节点是一个元素节点
      if(node1 instanceof Element){
        //如果节点名字为stu则创建一个student对象存入队列,并且获得它的num属性
        if(str.equals("stu")){
          stu = new Student();
          list.add(stu);
          //获得该元素节点的num属性
          String num = ((Element)node1).getAttribute("num");
          stu.num = Integer.parseInt(num);
        }else if(str.equals("name")){
          stu.name = node1.getTextContent();
        }else if(str.equals("sex")){
          stu.sex = node1.getTextContent();
        }else if(str.equals("cla")){
          stu.cla = node1.getTextContent();
        }
      }
      parseXML(node1);
    }
  }
}

 

posted @ 2015-04-27 16:14  AndroidM  阅读(525)  评论(0编辑  收藏  举报