热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XML的增删改查

{Dom4j修改xml文档}写出内容到xml文档DocumentdocnewSAXReader().read(newFile(.srccontact.

{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 //得到属性名称
String attrName = attributes.getQName(i);
//得到属性值
String attrValue = attributes.getValue(i);
sb.append(" "+attrName+"=\""+attrValue+"\"");
}
}
sb.append(">");
}

/**
* 文本内容
*/
@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);
}
}
}

推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 如何在Windows窗体应用程序中实现文件加密与解密功能
    本文介绍了在Windows窗体应用程序中实现文件加密与解密功能的步骤。首先,通过新建项目选择Windows窗体应用程序,并在自动创建的From1中构建启动窗体。然后,选择要加密的文件并获取页面的密码,判断密码是否大于六位数。如果不满足条件,提示用户添加文件后缀(.mr)以表示该文件已加密,并将文件内容进行乱码处理。通过本文的方法,可以实现文件的安全加密与解密。 ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
author-avatar
Rosalind33
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有