1.解析xml这里我用两种方式来实行,一种是jdk自带的,二种是用Dom4j来解析
2.环境配置
(1)这里我是用maven项目,它是pom.xml依赖如下:
<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)再创建一个stus.xml文件,和pom.xml文件是平级的,内容如下:
<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)再创建一个实体类,Student.java
package com.it.entity;
import lombok.Data;
@Data
public class Student {
private int sid;
private String name;
private String addr;
}
3.下面是第一种方式来解析xml
测试代码如下:
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. 创建DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 2. 使用DocumentBuilderFactory对象的newDocumentBuilder()方法创建一个DocumentBuilder对象
DocumentBuilder builder = dbf.newDocumentBuilder();
// 3. 使用DocumentBuilder的parse(file)方法来对于指定文件来进行解析,得到一个document对象
Document document = builder.parse(xmlFile);
// 4. 通过document对象的getElementsByTagName(tagName)来获取指定标签的节点
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();
// 遍历每个student节点中的每个sid,name,addr节点
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);
}
}
}
测试解果如下:
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.创建SAXReader对象
SAXReader reader = new SAXReader();
// 2.使用SAXReader对象读取给定的xml文件得到一个Document对象
Document document = reader.read(xmlFile);
// 3.通过Document对象的getRootElement()方法得到xml的跟节点元素
Element root = document.getRootElement();
// 4.通过root("根元素")顺藤摸瓜找到所有的子元素节点
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);
}
}
}
它的测试结果和上面的一样