一、XML解析
- XML解析共有4种方式,分别是DOM,SAX,DOM4J,JDOM,以下只介绍DOM和DOM4J的两种方式
二、DOM
- 新建一个xml文件stus.xml:
<students> <student> <sid>1</sid> <name>AAA</name> <addr>AA</addr> </student> <student> <sid>2</sid> <name>BBB</name> <addr>BB</addr> </student> <student> <sid>3</sid> <name>CCC</name> <addr>CC</addr> </student> <student> <sid>4</sid> <name>DDD</name> <addr>DD</addr> </student> </students>
- 新增一个与xml匹配的pojo Student的类
@Data public class Student { private int sid; private String name; private String addr; }
- 新增类实现对于给定的xml进行解析
public class TestStudent { 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 testParse(){ System.out.println(parseXml("stus.xml")); } }
- 运行结果:
[Student(sid=1, name=AAA, addr=AA), Student(sid=2, name=BBB, addr=BB), Student(sid=3, name=CCC, addr=CC), Student(sid=4, name=DDD, addr=DD)]
三、DOM4J
- 在pom文件中新增一个依赖
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>
- 新增一个XML文件
<students> <student> <sid>1</sid> <name>AAA</name> <addr>AA</addr> </student> <student> <sid>2</sid> <name>BBB</name> <addr>BB</addr> </student> <student> <sid>3</sid> <name>CCC</name> <addr>CC</addr> </student> <student> <sid>4</sid> <name>DDD</name> <addr>DD</addr> </student> </students>
- Student.java
@Data public class Student { private int sid; private String name; private String addr; }
- TestStudentXMLDom4j.java
public class TestStudentXMLDom4j { public List<Student> parseXml(String xmlFile){ List<Student> list = new ArrayList<>(); // 1. 创建SAXReader对象 SAXReader reader = new SAXReader(); try { // 2. 使用SAXReader对象读取给定的xml文件得到一个Document对象 Document document = reader.read(xmlFile); // 3. 通过Document对象的getRootElement()方法得到xml的跟节点元素 Element root = document.getRootElement(); //System.out.println(size()); // 4. 通过root("根元素")顺藤摸瓜找到所有的子元素节点 List<Element> elements = root.elements(); Student stu = null; for (Element el : elements) { List<Element> list2 = el.elements(); //System.out.println(list2); stu = new Student(); for (Element e : list2) { switch (e.getName()){ case "sid": String ssid = e.getText(); int sid = ssid == null ? 0 : Integer.parseInt(ssid); stu.setSid(sid); break; case "name": String name = e.getText(); stu.setName(name); break; case "addr": String addr = e.getText(); stu.setAddr(addr); break; } } list.add(stu); } } catch (DocumentException e) { e.printStackTrace(); } return list; } @Test public void testParseXml(){ System.out.println(parseXml("stus.xml")); } }
- 运行结果
[Student(sid=1, name=AAA, addr=AA), Student(sid=2, name=BBB, addr=BB), Student(sid=3, name=CCC, addr=CC), Student(sid=4, name=DDD, addr=DD)]
网友评论