zoukankan      html  css  js  c++  java
  • JAXP Dom 案例 对xml文件进行增加 查找 删除

    利用 JAXP 对 XML文件 的处理,把xml当做一个数据库来对待

    Student对象定义类

    public class Student {
    
        private String idcard;//身份证号
    
        private String examid;//准考证号
    
        private String name;//姓名
    
        private String location;//籍贯
    
        private float grade;//成绩
    
       
    
        public Student(){}
    
       
    
       
    
        public Student(String idcard, String examid, String name, String location,
    
                float grade) {
    
            super();
    
            this.idcard = idcard;
    
            this.examid = examid;
    
            this.name = name;
    
            this.location = location;
    
            this.grade = grade;
    
        }
    
     
    
     
    
        public String getIdcard() {
    
            return idcard;
    
        }
    
        public void setIdcard(String idcard) {
    
            this.idcard = idcard;
    
        }
    
        public String getExamid() {
    
            return examid;
    
        }
    
        public void setExamid(String examid) {
    
            this.examid = examid;
    
        }
    
        public String getName() {
    
            return name;
    
        }
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
        public String getLocation() {
    
            return location;
    
        }
    
        public void setLocation(String location) {
    
            this.location = location;
    
        }
    
        public float getGrade() {
    
            return grade;
    
        }
    
        public void setGrade(float grade) {
    
            this.grade = grade;
    
        }
    
        @Override
    
        public String toString() {
    
            return "Student [idcard=" + idcard + ", examid=" + examid + ", name="
    
                    + name + ", location=" + location + ", grade=" + grade + "]";
    
        }
    
       
    
    }
    View Code

    StudentDao 接口类

    //原则:抽象和实现分离

    //根据功能要求

    //接口中的每个方法:注释要写的清清楚楚,做到没有歧义

     1 public interface StudentDao {
     2 
     3     /**
     4 
     5      * 添加学生信息到数据库
     6 
     7      * @param s 封装了要保存的信息的学生对象
     8 
     9      * @return 成功了返回true,否则false
    10 
    11      */
    12 
    13     boolean addStudent(Student s);
    14 
    15     /**
    16 
    17      * 根据准考证号查询学生的信息
    18 
    19      * @param examid 准考证号
    20 
    21      * @return 没有找到返回null
    22 
    23      */
    24 
    25     Student findByExamid(String examid);
    26 
    27     /**
    28 
    29      * 根据姓名删除学生信息
    30 
    31      * @param name 学生的姓名
    32 
    33      * @return 删除成功返回true。删除失败或学生不存在都返回false
    34 
    35      */
    36 
    37     boolean delStudentByName(String name);
    38 
    39 }
    View Code

    StudentDaoimpl 实现类

      1 public class StudentDaoImpl implements StudentDao {
      2 
      3  
      4 
      5      public boolean addStudent(Student s) {
      6 
      7          boolean result = false;
      8 
      9          try {
     10 
     11               //得到Document对象
     12 
     13               Document doc = JaxpUtil.getDocument();//异常怎么办?抛:调用者得有能力处理。处理
     14 
     15               //创建<student>:设置属性
     16 
     17               Element studentE = doc.createElement("student");//<student></student>
     18 
     19               studentE.setAttribute("idcard", s.getIdcard());
     20 
     21               studentE.setAttribute("examid", s.getExamid());//<student idcard="370101" examid="438">
     22 
     23               //依次创建<name><location><grade>并设置主体内容
     24 
     25               Element nameE = doc.createElement("name");//<name></name>
     26 
     27               nameE.setTextContent(s.getName());// <name>郭美美</name>
     28 
     29              
     30 
     31               Element locationE = doc.createElement("location");
     32 
     33               locationE.setTextContent(s.getLocation());
     34 
     35              
     36 
     37               Element gradeE = doc.createElement("grade");
     38 
     39               gradeE.setTextContent(s.getGrade()+"");
     40 
     41               //建立与student元素的父子关系
     42 
     43               studentE.appendChild(nameE);
     44 
     45               studentE.appendChild(locationE);
     46 
     47               studentE.appendChild(gradeE);
     48 
     49               //把student挂接到根元素上
     50 
     51               Node rootNode = doc.getElementsByTagName("exam").item(0);
     52 
     53               rootNode.appendChild(studentE);
     54 
     55               //写回xml文档中
     56 
     57               JaxpUtil.write2xml(doc);
     58 
     59               result = true;
     60 
     61          } catch (Exception e) {
     62 
     63               throw new RuntimeException(e);//编译时异常--》运行时异常:异常转义;异常链
     64 
     65          }
     66 
     67          return result;
     68 
     69      }
     70 
     71  
     72 
     73      public Student findByExamid(String examid) {
     74 
     75          Student s = null;
     76 
     77          try {
     78 
     79               //得到Document对象
     80 
     81               Document doc = JaxpUtil.getDocument();
     82 
     83               //得到所有的<student>元素
     84 
     85               NodeList nl  = doc.getElementsByTagName("student");
     86 
     87               //遍历:判断属性的值和参数的值是否相等
     88 
     89               for(int i=0;i<nl.getLength();i++){
     90 
     91                    //相等:读取属性和子元素的文本,封装到Student对象中
     92 
     93                    Node node = nl.item(i);
     94 
     95                    if(node.getNodeType()==Node.ELEMENT_NODE){
     96 
     97                        Element e = (Element)node;
     98 
     99                        if(e.getAttribute("examid").equals(examid)){
    100 
    101                             s = new Student();
    102 
    103                             s.setIdcard(e.getAttribute("idcard"));
    104 
    105                             s.setExamid(examid);
    106 
    107                             s.setName(e.getElementsByTagName("name").item(0).getTextContent());
    108 
    109                             s.setLocation(e.getElementsByTagName("location").item(0).getTextContent());
    110 
    111                             s.setGrade(Float.parseFloat(e.getElementsByTagName("grade").item(0).getTextContent()));
    112 
    113                             break;
    114 
    115                        }
    116 
    117                    }
    118 
    119               }
    120 
    121               //返回数据
    122 
    123          } catch (Exception e) {
    124 
    125               throw new RuntimeException(e);//编译时异常--》运行时异常:异常转义;异常链
    126 
    127          }
    128 
    129          return s;
    130 
    131      }
    132 
    133  
    134 
    135      public boolean delStudentByName(String name) {
    136 
    137          boolean result = false;
    138 
    139          try {
    140 
    141               //得到Document对象
    142 
    143               Document doc = JaxpUtil.getDocument();
    144 
    145               //得到所有的name元素
    146 
    147               NodeList nl = doc.getElementsByTagName("name");
    148 
    149               //遍历:判断元素的文本和参数是否相等
    150 
    151               for(int i=0;i<nl.getLength();i++){
    152 
    153                    Node node = nl.item(i);
    154 
    155                    if(node.getTextContent().equals(name)){
    156 
    157                        //如果是:爷爷干掉爸爸
    158 
    159                        node.getParentNode().getParentNode().removeChild(node.getParentNode());
    160 
    161                        //写回xml文档
    162 
    163                        JaxpUtil.write2xml(doc);
    164 
    165                        //设置标记为true
    166 
    167                        result = true;
    168 
    169                    }
    170 
    171               }
    172 
    173          } catch (Exception e) {
    174 
    175               throw new RuntimeException(e);//编译时异常--》运行时异常:异常转义;异常链
    176 
    177          }
    178 
    179          return result;
    180 
    181      }
    182 
    183  
    184 
    185 }
    View Code

    JavaUtil

    //工具类

    //异常可以处理:不给调用者添麻烦

    //可以抛:谁用谁处理

     1 public class JaxpUtil {
     2 
     3     public static Document getDocument() throws ParserConfigurationException, SAXException, IOException{
     4 
     5         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     6 
     7         DocumentBuilder builder = dbf.newDocumentBuilder();//异常怎么办?哲学问题
     8 
     9         Document document = builder.parse("src/exam.xml");
    10 
    11         return document;
    12 
    13     }
    14 
    15     public static void write2xml(Document document) throws TransformerException{
    16 
    17         TransformerFactory tf = TransformerFactory.newInstance();
    18 
    19         Transformer ts = tf.newTransformer();
    20 
    21         ts.transform(new DOMSource(document), new StreamResult("src/exam.xml"));
    22 
    23     }
    24 
    25 }
    View Code

    StudentDaoImplTest 测试类

     1 public class StudentDaoImplTest {
     2 
     3     public static void main(String[] args) {
     4 
     5        StudentDao dao = new StudentDaoImpl();
     6 
     7  
     8 
     9 //     Student s = new Student();
    10 
    11 //     s.setExamid("999");
    12 
    13 //     s.setIdcard("1101");
    14 
    15 //     s.setName("牛骞");
    16 
    17 //     s.setLocation("河南");
    18 
    19 //     s.setGrade(100);
    20 
    21 //     dao.addStudent(s);
    22 
    23       
    24 
    25        Student s = dao.findByExamid("999");
    26 
    27        System.out.println(s);
    28 
    29       
    30 
    31 //     boolean b = dao.delStudentByName("牛骞");
    32 
    33 //     System.out.println(b);
    34 
    35     }
    View Code

     

     
     

     

  • 相关阅读:
    Spark函数详解系列之RDD基本转换
    Spark算子之aggregateByKey详解
    基于Apache Spark机器学习的客户流失预测
    Spark partitionBy
    Spark中repartition和partitionBy的区别
    Spark快速获得CrossValidator的最佳模型参数
    Spark MLlib之水塘抽样算法(Reservoir Sampling)
    机器学习-加权采样算法简介
    基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘(转)
    Mark 装修建材 清单
  • 原文地址:https://www.cnblogs.com/loveincode/p/5004975.html
Copyright © 2011-2022 走看看