JavaWeb|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的学生的姓名,改为“王丽”
  • 【JavaWeb|XML的增删改查】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); } } }

    推荐阅读