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); } } }