【JAVA学习小结】-【用JAXP解析包解析XML方法】-【第一篇DOM解析】

前端之家收集整理的这篇文章主要介绍了【JAVA学习小结】-【用JAXP解析包解析XML方法】-【第一篇DOM解析】前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

JAXP开发工具包j2se的一部分,它由javax.xml、org.w3c.dom、org.xml.sax 包及其子包组成。

在javax.xml.parsers包中,定义了几个工厂类,通过调用这几个工厂类,可以创建dom和sax解析器,对XML文档进行解析。

自己尝试使用了DOM解析器来解析XML文档,给大家分享下经验,第一次写技术BLOG,有缺陷的地方还望大家拍砖。

具体代码和注释如下:

1、创建一个XmlUtils类,这里面写2个方法,一个方法是用来得到Document对象,一个方法用来将内存中的数据写入指定XML文档。

  1. import java.io.FileOutputStream;
  2. import java.io.IOException;
  3. import javax.xml.parsers.DocumentBuilder;
  4. import javax.xml.parsers.DocumentBuilderFactory;
  5. import javax.xml.parsers.ParserConfigurationException;
  6. import javax.xml.transform.Transformer;
  7. import javax.xml.transform.TransformerConfigurationException;
  8. import javax.xml.transform.TransformerException;
  9. import javax.xml.transform.TransformerFactory;
  10. import javax.xml.transform.dom.DOMSource;
  11. import javax.xml.transform.stream.StreamResult;
  12. import org.w3c.dom.Document;
  13. import org.xml.sax.SAXException;
  14.  
  15.  
  16. public class XmlUtils {
  17. //定义文档路径
  18. public static String filename = "src/test.xml";
  19. //获取解析后的XML文档方法
  20. public static Document getDocument() throws Exception {
  21. //获取Dom工厂实例
  22. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  23. //获取Dom解析器
  24. DocumentBuilder builder = factory.newDocumentBuilder();
  25. //解析所需文档
  26. return builder.parse(filename);
  27. }
  28. //将内存中的数据写入XML中
  29. public static void document2Xml(Document document) throws Exception{
  30. //获取工厂实例
  31. TransformerFactory tffactory=TransformerFactory.newInstance();
  32. //获取Transformer对象
  33. Transformer tf =tffactory.newTransformer();
  34. //调用transform(Source xmlSource,Result outputTarget) 方法,将内存数据写入指定XML
  35. tf.transform(new DOMSource(document),new StreamResult(new FileOutputStream(filename)));
  36. }
  37. }


2、用XML作为数据库存储学生的信息(姓名,城市和身份证号),创建一个StudentBean类,来获取Student对象

  1. public class StudentBean {
  2. private String name;
  3. private double idcard;
  4. private String city;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public double getIdcard() {
  12. return idcard;
  13. }
  14. public void setIdcard(double idcard) {
  15. this.idcard = idcard;
  16. }
  17. public String getCity() {
  18. return city;
  19. }
  20. public void setCity(String city) {
  21. this.city = city;
  22. }
  23. }


3、StudentDao类来处理对XML增删查的功能

  1. import java.io.IOException;
  2. import javax.xml.parsers.ParserConfigurationException;
  3. import org.junit.Test;
  4. import org.w3c.dom.Document;
  5. import org.w3c.dom.Element;
  6. import org.w3c.dom.NodeList;
  7. import org.xml.sax.SAXException;
  8. import cn.shenyoujun.Bean.StudentBean;
  9. import cn.shenyoujun.Exception.StudentNotExistException;
  10. import cn.shenyoujun.XmlUtils.XmlUtils;
  11.  
  12.  
  13. public class StudentDao {
  14. //增加学生信息方法
  15. public void add(StudentBean student) {
  16. try {
  17. Document document = XmlUtils.getDocument();
  18. Element student_tag = document.createElement("student");
  19. student_tag.setAttribute("name",student.getName());
  20. Element idcard = document.createElement("idcard");
  21. Element city = document.createElement("city");
  22. idcard.setTextContent(student.getIdcard() + "");
  23. city.setTextContent(student.getCity());
  24. student_tag.appendChild(idcard);
  25. student_tag.appendChild(city);
  26. document.getElementsByTagName("exam").item(0)
  27. .appendChild(student_tag);
  28. XmlUtils.document2Xml(document);
  29. System.out.print("添加成功");
  30. } catch (Exception e) {
  31. // TODO Auto-generated catch block
  32. throw new RuntimeException(e);
  33. }
  34. }
  35.  
  36. //删除学生信息方法
  37. public void remove(String name) throws StudentNotExistException {
  38.  
  39.  
  40. try {
  41. Document document = XmlUtils.getDocument();
  42. NodeList list = document.getElementsByTagName("student");
  43. StudentBean sb = new StudentBean();
  44. for (int i = 0; i < list.getLength(); i++) {
  45. Element student = (Element) list.item(i);
  46. if (student.getAttribute("name").equals(name)) {
  47. list.item(i).getParentNode().removeChild(list.item(i));
  48. XmlUtils.document2Xml(document);
  49. }
  50. }
  51. throw new StudentNotExistException(name + "不存在!");
  52. } catch (StudentNotExistException e) {
  53. throw e;
  54. } catch (Exception e) {
  55. throw new RuntimeException(e);
  56. }
  57. }
  58. //寻找学生信息方法
  59. public StudentBean search(String name) {
  60. try {
  61. Document document = XmlUtils.getDocument();
  62. NodeList list = document.getElementsByTagName("student");
  63. StudentBean sb = new StudentBean();
  64. for (int i = 0; i < list.getLength(); i++) {
  65. Element student = (Element) list.item(i);
  66. if (student.getAttribute("name").equals(name)) {
  67. sb.setName(name);
  68. sb.setIdcard(Double.parseDouble(student
  69. .getElementsByTagName("idcard").item(0)
  70. .getTextContent()));
  71. sb.setCity(student.getElementsByTagName("city").item(0)
  72. .getTextContent());
  73. return sb;
  74. }
  75. }
  76. return null;
  77. } catch (Exception e) {
  78. // TODO Auto-generated catch block
  79. throw new RuntimeException(e);
  80. }
  81. }
  82. }

4、最后写个单元测试类,来测试这些功能

  1. package Junit;
  2. import org.junit.Test;
  3. import cn.shenyoujun.Bean.StudentBean;
  4. import cn.shenyoujun.Dao.StudentDao;
  5. import cn.shenyoujun.Exception.StudentNotExistException;
  6.  
  7. public class TestStudentDao {
  8. @Test
  9. public void testAdd() {
  10. StudentDao sd = new StudentDao();
  11. StudentBean s = new StudentBean();
  12. s.setName("张三");
  13. s.setCity("nanjing");
  14. s.setIdcard(2);
  15. sd.add(s);
  16. }
  17. @Test
  18. public void testSearch(){
  19. StudentDao sd = new StudentDao();
  20. String name="张三";
  21. StudentBean sb=sd.search(name);
  22. System.out.print(sb.getName()+" "+sb.getCity()+" "+sb.getIdcard());
  23. }
  24. @Test
  25. public void testRemove(){
  26. StudentDao sd = new StudentDao();
  27. String name="张三";
  28. try {
  29. sd.remove(name);
  30. } catch (StudentNotExistException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }


总结下Dom解析的优劣点:

使用Dom解析的原理是将所有的标签和熟悉都解析成对象存入到内存中,优点是对做增删改的操作比较方便


但是缺点是对内存消耗大,不宜做查询

猜你在找的XML相关文章