使用DOM解析XML文档
使用DOM解析XML文档的步骤:
创建解析器工厂对象
由解析器工厂对象创建解析器对象
由解析器对象对指定XML文件进行解析,构建相应DOM树,创建Document对象
以Document对象为起点对DOM树的节点进行增删改查操作。
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<Students>
<Student Id="01">
<Name>张三</Name>
<Sex>true</Sex>
<Score>99</Score>
</Student>
<Student Id="2">
<Name>李四</Name>
<Sex>false</Sex>
<Score>55</Score>
</Student>
</Students>
代码:
public class StudentOperator {
private Map<Integer, Student> students;
/**
* 缺省构造方法,实例化一个学生Map集合
*/
public StudentOperator() {
students = new HashMap<Integer, Student>();
xmlRead("students.xml");
}
/**
* 将xml数据读取到集合
* @param file
*/
public void xmlRead(String file) {
// 创建文件解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 创建文件解析对象
DocumentBuilder db;
// 创建文档对象
Document doc;
try {
db = dbf.newDocumentBuilder();
doc = db.parse(file);
//获取节点集合对象
NodeList listStu = doc.getElementsByTagName("Student");
for (int i = 0; i < listStu.getLength(); i++) {
//获取节点集合中的子节点
Node node = listStu.item(i);
//将节点父对象转换成节点子对象
Element stu = (Element) node;
//将节点值添加到实体类属性
Student student = new Student();
//获取Student元素的属性值
String id = stu.getAttribute("Id");
student.setId(Integer.parseInt(id));
for (Node first = stu.getFirstChild(); first != null; first = first
.getNextSibling()) {
if (first.getNodeType() == Node.ELEMENT_NODE) {
if (first.getNodeName().equals("Name")) {
student.setName(first.getTextContent());
} else if (first.getNodeName().equals("Sex")) {
student.setSex(Boolean.parseBoolean(first
.getTextContent()));
} else if (first.getNodeName().equals("Score")) {
student.setScore(Double.parseDouble(first
.getTextContent()));
}
}
}
// 添加到学生集合
students.put(student.getId(), student);
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 将集合写入xml
* @param file
*/
public void xmlWrite(String file) {
FileWriter fw;
try {
fw = new FileWriter(file);
fw.write("<?xml version='1.0' encoding='UTF-8'?>\r\n");
fw.write("<Students>\r\n");
for (Student s : students.values()) {
fw.write("\t<Student Id=\"" + s.getId() + "\">\r\n");
fw.write("\t\t<Name>" + s.getName() + "</Name>\r\n");
fw.write("\t\t<Sex>" + s.getSex() + "</Sex>\r\n");
fw.write("\t\t<Score>" + s.getScore() + "</Score>\r\n");
fw.write("\t</Student>\r\n");
}
fw.write("</Students>\r\n");
fw.close();
System.out.println("写入完成");
} catch (IOException e) {
e.printStackTrace();
}
}
a)解析XML文件:读取XML节点内容
i.创建解析器工厂:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance()
ii.创建解析器对象:DocumentBuilder db = dbf.newDocumentBuilder()
iii.创建XML文档对象树:Document doc = db.parse(“student.xml”)
iv.获取指定节点集合,进行遍历:NodeList nodes = doc.getElementsByTagName(“Student”)
b)NodeList
i.getLength():节点集合的长度
ii.item(index):取指定位置的节点
c)Node
i.getFirstChild():获取第一个子节点
ii.getNextSibling():获取当前节点的下一个兄弟节点
iii.getNodeType():获取节点类型,与枚举值进行对比,Node.ELEMENT_NODE
iv.getNodeName():获取节点的名称
v.getTextContent():获取节点的值
d)Element
i.getAttribute(String):获取元素的属性值,通过属性名获取