包括三个文件:studentInfo.xml(待解析的xml文件),DomBuilder.java(解析的主要类),TestDomBuilder.java(测试解析的结果),代码分别如下(由于使用csdn blog自带的代码粘贴工具会朝里加入一些"..."字符,虽然利于查看,但是不利于把代码copy出来运行,而亲自运行代码对程序员来说是很重要的,故没有使用csdn blog自带的代码粘贴工具来插入代码,而是用着用直白的方式):
studentInfo.xml
崔卫兵
PC学院
62354666
男,1982年生,硕士,现就读于北京邮电大学
cwb
PC学院
62358888
男,1987年生,硕士,现就读于中国农业大学
xxxxx
xxx学院
66666666
注视中,注释中
yyyyyy
yyyy学院
88888888
注视中111,注释中222
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 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节点的子节点,不同于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 hashMap = new HashMap();
DomBuilder db=new DomBuilder();
db.executeParser("studentInfo.xml", hashMap);
System.out.println("姓名/t年龄/t学院/t学院领导/t电话/t/t备注");
for(int i=0;i
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