XML的增删改查

{Dom4j修改xml文档}

写出内容到xml文档

        Document doc = new SAXReader().read(new File("./src/contact.xml"));
        //指定文件输出的位置
        FileOutputStream out = new FileOutputStream("c:/io/contact.xml");
        /**
         * 1.指定写出的格式
         */
//      OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候
        OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候
        /**
         * 2.指定生成的xml文档的编码
         *    同时影响了xml文档保存时的编码  和  xml文档声明的encoding的编码(xml解析时的编码)
         *    结论: 使用该方法生成的xml文档避免中文乱码问题。
         */
        format.setEncoding("utf-8");
        //1.创建写出对象
        XMLWriter writer = new XMLWriter(out,format);
        //2.写出对象
        writer.write(doc);
        //3.关闭流
        writer.close();

修改xml内容

  • 增加:
  • DocumentHelper.createDocument()  增加文档
    addElement("名称")  增加标签
    addAttribute("名称",“值”)  增加属性
    
    • 案例:

      /**
       * 1.创建文档
       */
      Document doc = DocumentHelper.createDocument();
      /**
       * 2.增加标签
       */
      Element rootElem = doc.addElement("contactList");
      //doc.addElement("contactList");
      Element contactElem = rootElem.addElement("contact");
      contactElem.addElement("name");
      /**
       * 3.增加属性
       */
      contactElem.addAttribute("id", "001");
      contactElem.addAttribute("name", "eric");   
      //把修改后的Document对象写出到xml文档中
      FileOutputStream out = new FileOutputStream("e:/contact.xml");
      OutputFormat format = OutputFormat.createPrettyPrint();
      format.setEncoding("utf-8");
      XMLWriter writer = new XMLWriter(out,format);
      writer.write(doc);
      writer.close();
      
  • 修改
  • Attribute.setValue("值")  修改属性值
    Element.addAtribute("同名的属性名","值")  修改同名的属性值
    Element.setText("内容")  修改文本内容
    
    • 案例

      Document doc = new SAXReader().read(new File("./src/contact.xml"));
      /**
       * 方案一: 修改属性值   1.得到标签对象 2.得到属性对象 3.修改属性值
       */
      //1.1  得到标签对象
      /*
      Element contactElem = doc.getRootElement().element("contact");
      //1.2 得到属性对象
      Attribute idAttr = contactElem.attribute("id");
      //1.3 修改属性值
      idAttr.setValue("003");
      */
      /**
       * 方案二: 修改属性值
       */
      //1.1  得到标签对象
      /*
      Element contactElem = doc.getRootElement().element("contact");
      //1.2 通过增加同名属性的方法,修改属性值
      contactElem.addAttribute("id", "004");
      */
      /**
       * 修改文本 1.得到标签对象 2.修改文本
       */
      Element nameElem = doc.getRootElement().
          element("contact").element("name");
      nameElem.setText("李四");
      
      
      
      FileOutputStream out = new FileOutputStream("e:/contact.xml");
      OutputFormat format = OutputFormat.createPrettyPrint();
      format.setEncoding("utf-8");
      XMLWriter writer = new XMLWriter(out,format);
      writer.write(doc);
      writer.close();
      
  • 删除
  • Element.detach();  删除标签  
    Attribute.detach();  删除属性
    
    • 案例

      Document doc = new SAXReader().read(new File("./src/contact.xml"));
      
      /**
       * 1.删除标签     1.1 得到标签对象  1.2 删除标签对象    
       */
      // 1.1 得到标签对象
      /*
      Element ageElem = doc.getRootElement().element("contact")
                  .element("age");
      
      //1.2 删除标签对象
      ageElem.detach();
      //ageElem.getParent().remove(ageElem);
      */
      /**
       * 2.删除属性   2.1得到属性对象  2.2 删除属性
       */
      //2.1得到属性对象
      //得到第二个contact标签
      Element contactElem = (Element)doc.getRootElement().
          elements().get(1);
      //2.2 得到属性对象
      Attribute idAttr = contactElem.attribute("id");
      //2.3 删除属性
      idAttr.detach();
      //idAttr.getParent().remove(idAttr);
      
      FileOutputStream out = new FileOutputStream("e:/contact.xml");
      OutputFormat format = OutputFormat.createPrettyPrint();
      format.setEncoding("utf-8");
      XMLWriter writer = new XMLWriter(out,format);
      writer.write(doc);
      writer.close();
      

{小练习}

  • 1.使用dom4j的api来生成以下的xml文件
  • 
        
            张三
            
            计算机1班
            
    长沙
    李四 计算机2班
    长沙
  • 2.修改id为2的学生的姓名,改为“王丽”

  • 3.删除id为2的学生

  • *

{SAX解析}

DOM解析原理:一次性把xml文档加载进内存,然后在内存中构建Document树。对内存要求比较要。  
    缺点: 不适合读取大容量的xml文件,容易导致内存溢出。

SAX解析原理: 加载一点,读取一点,处理一点。对内存要求比较低。

DOM 与 SAX 比较

  • DOM解析

  • 原理: 一次性加载xml文档,不适合大容量的文件读取
    DOM解析可以任意进行增删改成
    DOM解析任意读取任何位置的数据,甚至往回读
    DOM解析面向对象的编程方法(Node,Element,Attribute),Java开发者编码比较简单。
  • SAX解析

  • 原理: 加载一点,读取一点,处理一点。适合大容量文件的读取
    SAX解析只能读取
    SAX解析只能从上往下,按顺序读取,不能往回读
    SAX解析基于事件的编程方法。java开发编码相对复杂。

第一个SAX读取xml文件程序

案例

public static void main(String[] args) throws Exception{
    //1.创建SAXParser对象
    SAXParser parser = SAXParserFactory.newInstance().newSAXParser();

    //2.调用parse方法
    /**
     * 参数一: xml文档
     * 参数二: DefaultHandler的子类
     */
    parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
}

/**
 * SAX处理程序(如何解析xml文档)
 * @author APPle
 *
 */
public class MyDefaultHandler extends DefaultHandler {

    /**
     * 开始文档时调用
     */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("MyDefaultHandler.startDocument()");
    }

    /**
     * 开始标签时调用
     * @param qName: 表示开始标签的标签名
     * @param attributes: 表示开始标签内包含的属性列表
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        System.out.println("MyDefaultHandler.startElement()-->"+qName);
    }

    /**
     * 结束标签时调用
     * @param qName: 结束标签的标签名称
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("MyDefaultHandler.endElement()-->"+qName);
    }

    /**
     * 读到文本内容的时调用
     * @param ch: 表示当前读完的所有文本内容
     * @param start: 表示当前文本内容的开始位置
     * @param length: 表示当前文本内容的长度
     * char[](                                       张三              20)   100
     *                              98 2   
     */ 
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //得到当前文本内容
        String content = new String(ch,start,length);
        System.out.println("MyDefaultHandler.characters()-->"+content);
    }

    /**
     * 结束文档时调用
     */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("MyDefaultHandler.endDocument()");
    }

}

读取contact.xml文件,完整输出文档内容

案例

public static void main(String[] args)throws Exception {
    //1.创建SAXParser
    SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
    //2.读取xml文件
    MyDefaultHandler2 handler = new MyDefaultHandler2();
    parser.parse(new File("./src/contact.xml"), handler);
    String content = handler.getContent();
    System.out.println(content);
}

/**
 * SAX处理器程序
 * @author APPle
 */
public class MyDefaultHandler2 extends DefaultHandler {
    //存储xml文档信息
    private StringBuffer sb = new StringBuffer();

    //获取xml信息
    public String getContent(){
        return sb.toString();
    }


    /**
     * 开始标签
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        sb.append("<"+qName);
        //判断是否有属性
        if(attributes!=null){
            for(int i=0;i");
    }

    /**
     * 文本内容
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //得到当前读取的文本
        String content = new String(ch,start,length);
        sb.append(content);
    }

    /**
     * 结束标签
     */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        sb.append("");
    }
}

使用sax解析把 xml文档封装成对象

案例

public static void main(String[] args)throws Exception {
    SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
    MyDefaultHandler3 handler = new MyDefaultHandler3();
    parser.parse(new File("./src/contact.xml"), handler);
    List list = handler.getList();
    for (Contact contact : list) {
        System.out.println(contact);
    }
}

/**
 * SAX处理程序
 * @author APPle
 *
 */
public class MyDefaultHandler3 extends DefaultHandler {
    //存储所有联系人对象
    private List list = new ArrayList();

    public List getList(){
        return list;
    }
    //保存一个联系人信息
    private Contact contact;
    /**
     * 思路: 
     *  1)创建Contact对象
     *  2)把每个contact标签内容存入到Contact对象
     *  3)把Contact对象放入List中
     */
    //用于临时存储当前读到的标签名
    private String curTag;

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        curTag = qName;
        //读取到contact的开始标签创建Contact对象
        if("contact".equals(qName)){
            contact = new Contact();

            //设置id值
            contact.setId(attributes.getValue("id"));
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        //当前文本内容
        String content = new String(ch,start,length);

        if("name".equals(curTag)){
            contact.setName(content);
        }

        if("age".equals(curTag)){
            contact.setAge(content);
        }

        if("phone".equals(curTag)){
            contact.setPhone(content);
        }

        if("email".equals(curTag)){
            contact.setEmail(content);
        }

        if("qq".equals(curTag)){
            contact.setQq(content);
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        //设置空时为了避免空格换行设置到对象的属性中
        curTag = null;
        //读到contact的结束标签放入List中
        if("contact".equals(qName)){
            list.add(contact);
        }
    }
}

你可能感兴趣的:(JavaWeb,XML)