1.解析xml這里我用兩種方式來(lái)實(shí)行,一種是jdk自帶的,二種是用Dom4j來(lái)解析
2.環(huán)境配置
(1)這里我是用maven項(xiàng)目,它是pom.xml依賴(lài)如下:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
(2)再創(chuàng)建一個(gè)stus.xml文件,和pom.xml文件是平級(jí)的,內(nèi)容如下:
<students>
<student>
<sid>1</sid>
<name>huhoujun</name>
<addr>xian</addr>
</student>
<student>
<sid>2</sid>
<name>lishushu</name>
<addr>beijing</addr>
</student>
<student>
<sid>3</sid>
<name>chenggang</name>
<addr>shenzhen</addr>
</student>
<student>
<sid>4</sid>
<name>liaozizhong</name>
<addr>guangzhou</addr>
</student>
<student>
<sid>5</sid>
<name>dengweida</name>
<addr>guangzhou</addr>
</student>
<student>
<sid>6</sid>
<name>xiaodechao</name>
<addr>dalian</addr>
</student>
</students>
(3)再創(chuàng)建一個(gè)實(shí)體類(lèi),Student.java
package com.it.entity;
import lombok.Data;
@Data
public class Student {
private int sid;
private String name;
private String addr;
}
3.下面是第一種方式來(lái)解析xml
測(cè)試代碼如下:
package com.it.test;
import com.it.entity.Student;
import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class XmlTest {
public List<Student> parseXml(String xmlFile){
List<Student> list = new ArrayList<>();
// 1. 創(chuàng)建DocumentBuilderFactory對(duì)象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 2. 使用DocumentBuilderFactory對(duì)象的newDocumentBuilder()方法創(chuàng)建一個(gè)DocumentBuilder對(duì)象
DocumentBuilder builder = dbf.newDocumentBuilder();
// 3. 使用DocumentBuilder的parse(file)方法來(lái)對(duì)于指定文件來(lái)進(jìn)行解析,得到一個(gè)document對(duì)象
Document document = builder.parse(xmlFile);
// 4. 通過(guò)document對(duì)象的getElementsByTagName(tagName)來(lái)獲取指定標(biāo)簽的節(jié)點(diǎn)
NodeList nodeList = document.getElementsByTagName("student");
Student stu = null;
for (int i = 0; i < nodeList.getLength(); i++) {
stu = new Student();
Node node = nodeList.item(i);
NodeList nodes = node.getChildNodes();
// 遍歷每個(gè)student節(jié)點(diǎn)中的每個(gè)sid,name,addr節(jié)點(diǎn)
for (int j = 0; j < nodes.getLength(); j++) {
Node item = nodes.item(j);
//System.out.println(item);
switch (item.getNodeName()){
case "sid":
String ssid = item.getTextContent();
int sid = ssid == null ? 0 : Integer.parseInt(ssid);
stu.setSid(sid);
break;
case "name":
String name = item.getTextContent();
stu.setName(name);
break;
case "addr":
String addr = item.getTextContent();
stu.setAddr(addr);
break;
}
}
list.add(stu);
}
//System.out.println(document);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
@Test
public void testStudent1(){
List<Student> students = parseXml("stus.xml");
for (Student student : students) {
System.out.println(student);
}
}
}
測(cè)試解果如下:
Student(sid=1, name=huhoujun, addr=xian)
Student(sid=2, name=lishushu, addr=beijing)
Student(sid=3, name=chenggang, addr=shenzhen)
Student(sid=4, name=liaozizhong, addr=guangzhou)
Student(sid=5, name=dengweida, addr=guangzhou)
Student(sid=6, name=xiaodechao, addr=dalian)
4.第二種Dom4j方式解析xml
package com.it.test;
import com.it.entity.Student;
import org.dom4j.Document;
import org.dom4j.DocumentFactory;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import org.xml.sax.SAXException;
import java.util.ArrayList;
import java.util.List;
public class Dom4jTest {
public List<Student> parseXml(String xmlFile){
List<Student> stus = new ArrayList<>();
try {
// 1.創(chuàng)建SAXReader對(duì)象
SAXReader reader = new SAXReader();
// 2.使用SAXReader對(duì)象讀取給定的xml文件得到一個(gè)Document對(duì)象
Document document = reader.read(xmlFile);
// 3.通過(guò)Document對(duì)象的getRootElement()方法得到xml的跟節(jié)點(diǎn)元素
Element root = document.getRootElement();
// 4.通過(guò)root("根元素")順藤摸瓜找到所有的子元素節(jié)點(diǎn)
List<Element> elements = root.elements();
Student student = null;
for (Element e1 : elements) {
List<Element> elements1 = e1.elements();
student = new Student();
for (Element e2 : elements1) {
switch (e2.getName()){
case "sid":
String ssid = e2.getText();
int sid = ssid == null ? 0 : Integer.parseInt(ssid);
student.setSid(sid);
break;
case "name":
String name = e2.getText();
student.setName(name);
break;
case "addr":
String addr = e2.getText();
student.setAddr(addr);
break;
}
}
stus.add(student);
}
} catch (Exception e) {
e.printStackTrace();
}
return stus;
}
@Test
public void testStudent1(){
List<Student> students = parseXml("stus.xml");
for (Student student : students) {
System.out.println(student);
}
}
}
它的測(cè)試結(jié)果和上面的一樣