//xml文档 testDOM.xml
<?xml version="1.0" encoding="gb2312"?>
<students>
<student id="1" name="张三">
<age>18</age>
<sex>男</sex>
</student>
<student id="2" name="里司">
<age>16</age>
<sex>女</sex>
</student>
<student id="3" name="王五">
<age>19</age>
<sex>男</sex>
</student>
</students>
//src源文件
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.jdom.input.SAXBuilder;
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;
import org.xml.sax.SAXException;
/**
* 功能:
* @author yaos email: [email protected]
* @date 2008 11 25
*/
public class TestParseDOM {
/**
* 功能:
* @param args
*/
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
DocumentBuilder db = domfac.newDocumentBuilder();
Document doc = db.parse(new File("src/testDOM.xml"));//装载.xml文件 路径在default package下
Element root = doc.getDocumentElement();//获得根元素
NodeList nodelist = root.getChildNodes();//获得根元素下面的 所有节点的list集合
List list = new ArrayList();//存放解析后的结果
if(nodelist!=null){
for(int i=0;i<nodelist.getLength();i++){//遍历节点list集合
Node node = nodelist.item(i);//获得第i个节点
if(node.getNodeType()==Node.ELEMENT_NODE){
// Method 1.如果知道这一级有多少个attribute但是不知道attribute的名字
String id = node.getAttributes().item(0).getNodeName();
String idValue = node.getAttributes().item(0).getNodeValue();
String name = node.getAttributes().item(1).getNodeName();
String nameValue = node.getAttributes().item(1).getNodeValue();
Map map = new HashMap();
map.put(id, idValue);
map.put(name, nameValue);
list.add(map);
// Method 2.如果知道这一级有多少个attribute并且知道attribute的名字
// String id = node.getAttributes().getNamedItem("id").getNodeName();
// String idValue = node.getAttributes().getNamedItem("id").getNodeValue();
// String name = node.getAttributes().getNamedItem("name").getNodeName();
// String nameValue = node.getAttributes().getNamedItem("name").getNodeValue();
// Map map = new HashMap();
// map.put(id, idValue);
// map.put(name, nameValue);
// list.add(map);
// Method 3.如果不知道这一级有多少个attribute并且不知道attribute的名字
// NamedNodeMap nodeMap = node.getAttributes();
// for(int j = 0 ; j < nodeMap.getLength();j++){
// String key = nodeMap.item(j).getNodeName();
// String value = nodeMap.item(j).getNodeValue();
// Map keyValueMap = new HashMap();
// keyValueMap.put(key, value);
// list.add(keyValueMap);
// }
for(Node child=node.getFirstChild();child!=null;child=child.getNextSibling()){//遍利当前节点下的节点,(指向第一个节点;如果节点不为空;节点指向下一个兄弟节点)
if(child.getNodeType()==Node.ELEMENT_NODE){//如果节点是 节点类型
String childName = child.getNodeName();//获得的节点的名字(age或是sex)
String childValue = child.getFirstChild().getNodeValue();//获得节点的值(注意使用的是 第一个孩子节点的value而不是直接取value,即age或sex对应的值)
// String childValue = child.getTextContent();//使用此方法获得的与上面相同的效果,具体使用不明确
// 如果age和sex节点里面还有attrbitue的话可以使用以下方式编历
// <student id="1" name="张三">
// <age a="A">18</age>
// <sex b="B">男</sex>
// </student>
// String tempName = child.getAttributes().item(0).getNodeName();
// String tempValue = child.getAttributes().item(0).getNodeValue();
// System.out.println(tempName+"___"+tempValue);
Map map1 = new HashMap();
map1.put(childName, childValue);
list.add(map1);
}
}
}
}
}
for(int i = 0 ; i < list.size() ; i ++){
Map map = (Map) list.get(i);
for(Object obj : map.keySet()){
System.out.println(obj.toString()+"-->"+map.get(obj));
}
}
}
}