使用Java自带DOM工具解析XML .

包括三个文件:studentInfo.xml(待解析的xml文件),DomBuilder.java(解析的主要类),TestDomBuilder.java(测试解析的结果),代码分别如下(由于使用csdn blog自带的代码粘贴工具会朝里加入一些"..."字符,虽然利于查看,但是不利于把代码copy出来运行,而亲自运行代码对程序员来说是很重要的,故没有使用csdn blog自带的代码粘贴工具来插入代码,而是用着用直白的方式):

 studentInfo.xml

 <?xml version="1.0" encoding="gb2312"?>
<student>
    <person age="25"><!--如果没有age属性,默认的为20-->
        <name>崔卫兵</name>
        <college>PC学院</college>
        <telephone>62354666</telephone>
        <notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
    </person>
    <person>
        <name>cwb</name>
        <college leader="leader1">PC学院</college><!--如果没有leader属性,默认的为leader-->
        <telephone>62358888</telephone>
        <notes>男,1987年生,硕士,现就读于中国农业大学</notes>
    </person>
    <person age="45">
        <name>xxxxx</name>
        <college leader="">xxx学院</college>
        <telephone>66666666</telephone>
        <notes>注视中,注释中</notes>
    </person>
    <person age="">
        <name>yyyyyy</name>
        <college leader="学院领导">yyyy学院</college>
        <telephone>88888888</telephone>
        <notes>注视中111,注释中222</notes>
    </person>
</student>

 DomBuilder.java

 package domExample;

import java.util.HashMap;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * 用java自带的DOM工具实现对xml的编程
 *
 * @author cuiweibing
 * @since 2007.8.9
 */
public class DomBuilder {
 /**
  * 执行具体的解析工作
  * @param filename,待解析的既定格式的xml文件名(相对路径或者决定路径)
  * @param hm      ,HashMap 存放解析后的结果,供后继使用
  */
 /**
  * @param filename
  * @param hm
  */
 public void executeParser(String filename,HashMap<String,String> hm){
  DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();

  try {
   //产生解析实例
   DocumentBuilder dombuilder = domfac.newDocumentBuilder();
   //把XML文件读入放在FileInputStream中,并用其父类InputStream的实例接受
   InputStream is = new FileInputStream(filename);
   //根据输入XML文件流解析成Document结构,供下面遍历与操作使用
   Document doc = dombuilder.parse(is);
   //获取根结点student
   Element root = doc.getDocumentElement();
   NodeList persons = root.getChildNodes();
   //用于记录学生编号的变量
   int num=-1;
   if (persons != null) {
    //遍历所有person节点
    for (int i = 0; i < persons.getLength(); i++) {
     Node person = persons.item(i);
     if (person.getNodeType() == Node.ELEMENT_NODE) {
      num++;
      // 获取person节点的age属性的值
      Node personNode=person.getAttributes().getNamedItem("age");
      if(personNode!=null){
       String age = personNode.getNodeValue();
       if (age != null&&!age.equals("")) {
        hm.put(person.getNodeName() + "-age" + num, age);
       } else {
        hm.put(person.getNodeName() + "-age" + num, "20");
       }
      }else {
       hm.put(person.getNodeName() + "-age" + num, "20");
      }
      //遍历所有person节点的子节点
      for (Node node = person.getFirstChild(); node != null; node = node
        .getNextSibling()) {
       if (node.getNodeType() == Node.ELEMENT_NODE) {
        // 处理person节点的子节点name
        if (node.getNodeName().equals("name")) {
         String name = node.getNodeName();
         //不可用此,dom中也认为<name>崔卫兵</name>中的"崔卫兵"也是节点,而且是name节点的子节点,不同于SAX
         //String name = node.getNodeValue();
         String nameValue = node.getFirstChild().getNodeValue();
         hm.put(name + num, nameValue);
        }
        // 处理person节点的子节点college
        else if (node.getNodeName().equals("college")) {
         String name = node.getNodeName();
         String nameValue = node.getFirstChild().getNodeValue();
         hm.put(name + num, nameValue);
         //获取college节点的leader属性的值
         Node leaderNode=node.getAttributes().getNamedItem("leader");
         if(leaderNode!=null){
          String leader = leaderNode.getNodeValue();
          if (leader != null&&!leader.equals("")) {
           hm.put(node.getNodeName() + "-leader" + num, leader);
          } else {
           hm.put(node.getNodeName() + "-leader" + num, "leader");
          }
         }else {
          hm.put(node.getNodeName() + "-leader" + num, "leader");
         }
        }
        //处理person节点的子节点telephone
        else if (node.getNodeName().equals("telephone")) {
         String name = node.getNodeName();
         String nameValue = node.getFirstChild().getNodeValue();
         hm.put(name + num, nameValue);
        }
        //处理person节点的子节点notes
        else if (node.getNodeName().equals("notes")) {
         String name = node.getNodeName();
         String nameValue = node.getFirstChild().getNodeValue();
         hm.put(name + num, nameValue);
        }
       }
      }
     }
    }
   }
  } catch (ParserConfigurationException e) {
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (SAXException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 /**
  * 构造函数
  */
 public DomBuilder() {
 }
}

 TestDomBuilder.java

 package domExample;

import java.util.HashMap;

/**
 * 测试DomBuilder解析的情况
 * @author cuiweibing
 * @since 2007.8.9
 */
public class TestDomBuilder {
 public static void main(String[] args) {
     try{
       //获取解析完后的解析信息
       HashMap<String,String> hashMap = new HashMap<String,String>();
       DomBuilder db=new DomBuilder();
       db.executeParser("studentInfo.xml", hashMap);
       System.out.println("姓名/t年龄/t学院/t学院领导/t电话/t/t备注");
       for(int i=0;i<hashMap.size();i+=6){
         int j=i/6;
         System.out.print(hashMap.get("name"+j)+"/t");
         System.out.print(hashMap.get("person-age"+j)+"/t");
         System.out.print(hashMap.get("college"+j)+"/t");
         System.out.print(hashMap.get("college-leader"+j)+"/t");
         System.out.print(hashMap.get("telephone"+j)+"/t");
         System.out.println(hashMap.get("notes"+j)+"/t");
       }
     }catch(Exception ex){
       ex.printStackTrace();
     }
   }
}

  运行结果

姓名 年龄 学院 学院领导 电话  备注
崔卫兵 25 PC学院 leader 62354666 男,1982年生,硕士,现就读于北京邮电大学 
cwb 20 PC学院 leader1 62358888 男,1987年生,硕士,现就读于中国农业大学 
xxxxx 45 xxx学院 leader 66666666 注视中,注释中 
yyyyyy 20 yyyy学院 学院领导 88888888 注视中111,注释中222 

猜你喜欢

转载自zxb1985.iteye.com/blog/1828273