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版权协议,转载请附上原文出处链接和本声明。