javaDOM解析XML文件详解

dom可以解析和在程序运行时改变XML文件。在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构建代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,严重情况下可能还会导致内存溢出。(一般XML文件存放的数据不会特别大,因此这种情况一般不会考虑)
一、解析步骤
1.调用DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
2.调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
3.调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。
例如:
将xml文件中存放的Student信息解析,并创建Student对象,放到集合里,显示到桌面上。
这是一个Students.xml文件。

<?xml version="1.0" encoding="UTF-8"?>
<Students>
<!-- 这是注释 -->
	<student id="1011234" >
		<name>Tom</name>
		<age>20</age>
		<score>100</score>
	</student>
	<student id="1011223" >
		<name>jack</name>
		<age>22</age>
		<score>90</score>
	</student>
</Students>

这是Student类

package xml;

public class Student {
	private String id;
	private String name;
	private int age;
	private int score;
	  @Override
	    public String toString() {
	        return "Student{" +
	                "id='" + id + '\'' +
	                ", name='" + name + '\'' +
	                ", age=" + age +
	                ", score=" + score +
	                '}';
	    }
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}	
}

编程进行解析实现要求

package xmlParse;

import java.io.IOException;
import java.util.ArrayList;

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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import xml.Student;

public class DomTest {
	public static void main(String[] args) {
		try {
			 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			Document d = builder.parse("src/xml/Students.xml");
			ArrayList<Student> arr = new ArrayList<>();
			Element root = d.getDocumentElement();
			NodeList list = root.getChildNodes();
			for (int i = 0; i < list.getLength(); i++) {
				Node item = list.item(i);
				if(item.getNodeType()==Node.ELEMENT_NODE) {
					Student s = new Student();
					NamedNodeMap attributes = item.getAttributes();
					for (int j = 0; j < attributes.getLength(); j++) {
						s.setId(attributes.item(j).getNodeValue());
					}
					NodeList list2 = item.getChildNodes();
					for (int j = 0; j < list2.getLength(); j++) {
						Node item2 = list2.item(j);
						if (item2.getNodeType()==Node.ELEMENT_NODE) {
							Node node = item2.getFirstChild();							
							if (item2.getNodeName().equals("name")) {
								s.setName(node.getTextContent());
							}
							if (item2.getNodeName().equals("age")) {
								s.setAge(Integer.parseInt(node.getTextContent()));
							}
							if (item2.getNodeName().equals("score")) {
								s.setScore(Integer.parseInt(node.getTextContent()));
							}
						}
					}
					arr.add(s);
				}

			}	
			arr.forEach(System.out::println);
			
			
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

结果:
结果
二、dom创建(改变)XML文件
1.调用DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。
2.调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。
3.调用 DOM 解析器对象的newDocument()方法得到Document对象进行操作。
例如:
要利用它生成一个下图的XML文件;

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<sockets>
	<socket ID="client">
		<ip>127.0.2.1</ip>
		<port>10003</port>
	</socket>
	<socket ID="server">
		<ip>127.0.0.1</ip>
		<port>10001</port>
	</socket>
</sockets>

编程实现:

package xml;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

public class DOMTest {

	public static void main(String[] args) {
		
		try {
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();   
			DocumentBuilder builder = dbf.newDocumentBuilder();
			Document d = builder.newDocument();
			Element root = d.createElement("sockets");
			Element s1 = d.createElement("socket");
			Element s11 = d.createElement("ip");
			Element s12 = d.createElement("port");
			Element s2 = d.createElement("socket");
			Element s21 = d.createElement("ip");
			Element s22 = d.createElement("port");
			Attr attr1 = d.createAttribute("ID");
			attr1.setTextContent("server");
			Attr attr2 = d.createAttribute("ID");
			attr2.setTextContent("client");
			Text t1 = d.createTextNode("127.0.0.1");
			Text t11 = d.createTextNode("10001");
			Text t2 = d.createTextNode("127.0.2.1");
			Text t21 = d.createTextNode("10003");
			d.appendChild(root);
			root.appendChild(s2);
			root.appendChild(s1);
			s1.setAttributeNode(attr1);
			s1.appendChild(s11);
			s11.appendChild(t1);
			s1.appendChild(s12);
			s12.appendChild(t11);
			s2.setAttributeNode(attr2);
			s2.appendChild(s21);
			s21.appendChild(t2);
			s2.appendChild(s22);
			s22.appendChild(t21);
			TransformerFactory factory = TransformerFactory.newInstance();
			Transformer trans = factory.newTransformer();
			PrintWriter pw = new PrintWriter(new FileOutputStream("moon.xml"));
			StreamResult sr = new StreamResult(pw);
	        trans.transform(new DOMSource(d),sr);	
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}

总结:
利用dom解析XML文件,就是利用java中提供的类和方法,没有什么难度,只需要熟悉javaAPI即可。或者利用上网查询。


版权声明:本文为weixin_44138291原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。