XML

一、XML概述

  • XML是什么?

    • XML : Extensible Markup Language 可扩展标记语言 。 由w3c组织提供 , 2000年开发出1.0版本 , 现在用1.0版本居多 。
    • XML是一种数据存储或传输的格式 , 本质上就是一串字符串 。
  • XML是怎么保存数据的?
    • 在XML中 , 利用标签来保存数据 , 利用标签之间的层级关系表示数据之间的层级关系 。
    • 用户可以自定义标签 , 标签分为开始标签和结束标签 , 在开始标签和结束标签之间可以嵌套其它标签 。
  • XML应用场景
    • 传输数据

      • 由于XML本质上是一段字符串 , 具有跨平台性 , 所以可以在不同的系统之间进行数据交换 。
      • 如:天气数据XML接口 :http://flash.weather.com.cn/wmaps/xml/china.xml
    • 用作配置文件
      • XML可以有结构的保存数据 , 因此XML常常用作应用程序的配置文件

二、XML语法

  • 文档声明

    • 可以用来声明XML文档的基本属性信息 , 解析器会根据文档 声明类决定如何解析这个文档 。

      <?xml version="1.0" ebcoding="utf-8" ?>
      
    • version 用于指定XML文档所遵循的XML版本
    • encoding 用于通知XML解析器使用什么编码来解析该文档 encoding指定的编码必须和xml保存时指定的编码一致, 否则会出现乱码 。
    • 注意:
      • 一个XML文档有且仅有一个文档声明(规范要求)
      • 文档声明只能放在文档的首行 , 并且前面不能有任何内容 。
      • 如果一个XML文档没有文档声明 , 该文档是一个格式不良好的XML文档 。
  • 元素

    • 一个标签就是一个元素

       如:<book></book>其中 <book> 为开始标签  </book>为结束标签
      
    • 如果一个标签体内没有任何内容 , 那么可以将开始标签和结束标签合并

      如: <book/>
      
    • 一个xml文档中只能有一个根标签
    • 标签之间可以嵌套 , 来表示数据之间的层级关系 , 但不能出现交叉嵌套

      比如:
      <a>welcome to <b>www.tarena.com.cn</a></b>  错误
      <a>welcome to www.tarena.com.cn</b></a> 错误
      <a>welcome to www.tarena.com.cn<b/></a> 正确
      <a>welcome to www.tarena<b/>.com.cn</a> 正确
      
    • XML元素的命名规范:

      • 区分大小写

        如: <a/> 与 <A/> 是两个不同标签
        
      • 不能以数字或标点符号开头

        如: <123a/> 错误
        
      • 不能以任意形式的xml开头
      • 不能包含空格
      • 不能包含冒号
  • 属性
    • 一个标签可以有多个属性 , 多个属性之间可以用空格分开 , 属性值一定要用单引号, 或双引号引起来 。
    • 属性具有与 元素相同的命名规范 。
  • 注释

    • 格式

      <!-- 内容-->
      
    • 注意:
      • 注释不能放在文档声明前
      • 注释不能嵌套
  • 转义字符

    • 用其他符号代替特殊符号

      几个常用的转义字符
      <      &lt;
      >      &gt;
      "      &quot;
      '      &apos;
      &      &amp;
      
  • XML解析
    • DOM解析
    • SAX解析
    • 解析开发包
      • Jaxp 、 Jdom 、 dom4j

三、实例

  • 编写程序之前 ,需要些导入相应的解析XML的包dom4j.jar , 并build path
  • 被操作的XML文档

    <?xml version="1.0" encoding="utf-8" ?>
    <书架>    <书>     <书名>数据结构</书名>       <作者>严蔚敏</作者>        <售价>29.00元</售价> </书>    <书>     <书名>高等数学</书名>       <作者>同济大学数学系</作者>        <售价>55.00元</售价></书>
    </书架>
    
  • 入门程序

    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;/*** dom4j快速入门程序*/
    public class Demo1 {public static void main(String[] args) throws DocumentException {//1.创建解析器SAXReader reader = new SAXReader();//2.利用解析器读取xml文件Document doc = reader.read("book.xml");//3.获取根节点Element root = doc.getRootElement();//4.获取第一本书节点Element bookEle = root.element("书");//5.获取第一个书名节点Element bookNameEle = bookEle.element("书名");//6.获取书名中的内容String text = bookNameEle.getText();System.out.println("第一本书的书名为:"+text);}
    }
    
  • 操作元素

    • 在案例中先将创建解析器 , 读取文档这两部每次都需要写的操作抽取了出来作为工具方法
    • 对文档进行增、删、改后 , 需要将修改后的文档重新写入到xml中 , 所以也把重新写回xml的步骤也抽取出来 形成一个XMLUtils工具类 。
    • XMLUtils工具类

      import java.io.File;
      import java.io.FileOutputStream;import org.dom4j.Document;
      import org.dom4j.Element;
      import org.dom4j.io.OutputFormat;
      import org.dom4j.io.SAXReader;
      import org.dom4j.io.XMLWriter;public class XMLUtils {/*** 将更新的document写入到xml中* @param doc* @param xmlPath*/public static void write2Xml(Document doc, String xmlPath){try {//将更新的document写入到xml中,并加入格式输出器XMLWriter writer = new XMLWriter(new FileOutputStream(new File("book.xml")),OutputFormat.createPrettyPrint());writer.write(doc);writer.close();} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}/*** 解析xml文件,获取document对象* @param xmlPath* @return*/public static Document getDoc(String xmlPath){try {//1.创建解析器SAXReader reader = new SAXReader();//2.利用解析器读取xml文件Document doc = reader.read(xmlPath);return doc;} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e); }}
      }
      

    *对XML文档中的元素进行增、删、改、查

        import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;/*** dom4j操作元素节点**/public class Demo2 {public static void main(String[] args) throws DocumentException, IOException {//2.查询第二本书的售价,并输出到控制台//findPrice();//3.给第一本书添加一个特价节点(2种方式)//addPrice();//4.给第二本书在作者节点前插入一个特价节点//addPrice2();//5.删除第二本书的特价节点(2种方式)//deletePriceEle();//6.更新第一本书的特价节点的内容为19.8元//创建解析器并获取根节点Document doc = XMLUtils.getDoc("book.xml");doc.getRootElement().element("书").element("特价").setText("19.8元");//将更新的document写入到xml中XMLUtils.write2Xml(doc, "book.xml");System.out.println("执行完毕");}private static void deletePriceEle() {//创建解析器并获取根节点Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//获取root下所有节点集合List<Element> list = root.elements();//获取第二个本书Element bookEle2 = list.get(1);/*//方法一//获取特价节点Element priceEle2 = bookEle2.element("特价");//将特价节点从第二本书中删除bookEle2.remove(priceEle2);*///方法二//获取第二本书所有元素List list2 = bookEle2.elements();//删除第二个元素list2.remove(1);//将更新的document写入到xml中XMLUtils.write2Xml(doc, "book.xml");}private static void addPrice2() {//创建解析器并获取根节点Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//获取root下所有节点集合List<Element> list = root.elements();//获取第二个元素Element bookEle2 = list.get(1);//创建一个游离节点Element priceEle2 = DocumentHelper.createElement("特价");priceEle2.setText("6.6元");//将游离节点插入到指定位置List list2 = bookEle2.elements();list2.add(1, priceEle2);//将更新的document写入到xml中XMLUtils.write2Xml(doc, "book.xml");}private static void addPrice() throws UnsupportedEncodingException,FileNotFoundException, IOException {//创建解析器并获取根节点Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//获取第一本书Element bookEle = root.element("书");/*//方式一//创建一个游离的节点Element priceEle2 = DocumentHelper.createElement("特价");priceEle2.setText("9.9元");//将游离节点挂载到第一本书上bookEle.add(priceEle2);*///方式二//在第一本书上添加特价子节点Element priceEle2 = bookEle.addElement("特价");priceEle2.setText("8.8元");//将更新的document写入到xml中,并加入格式输出器XMLWriter writer = new XMLWriter(new FileOutputStream(new File("book.xml")),OutputFormat.createPrettyPrint());writer.write(doc);writer.close();}private static void findPrice() throws DocumentException {//1.创建解析器SAXReader reader = new SAXReader();//2.利用解析器读取xml文件Document doc = reader.read("book.xml");//3.获取根节点Element root = doc.getRootElement();//4.获取root下所有节点集合List<Element> list = root.elements();//5.获取第二本书节点Element bookEle2 = list.get(1);//6.获取第二本书的售价节点Element price = bookEle2.element("售价");//7.获取售价String text = price.getText();System.out.println("第二本书的售价为:"+text);}}
    
  • 操作元素的属性

        import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;/*** dom4j操作属性节点*/public class Demo3 {public static void main(String[] args) {//1.给第一本书添加一个属性,如:出版社="清华大学出版社"(2种方式)//addAttr();//2.在控制台上打印输出第一本书的出版社属性的值,并更新属性的值为“人民出版社”(3种方式)//findAndUpdateAttr();//3.删除第一本书的出版社属性(2种方式)//创建解析器,读取xml,获取根目录Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//获取第一本书Element bookEle = root.element("书");/*//方式一//获取第一本书的属性Attribute attr = bookEle.attribute("出版社");//将属性从第一本书中删除bookEle.remove(attr);*///方式二//如果给一个正常值,为添加,如果给一个null,则为删除bookEle.addAttribute("出版社",null);//将更新的document写入到xml文档中XMLUtils.write2Xml(doc, "book.xml");System.out.println("执行完成");}private static void findAndUpdateAttr() {//创建解析器,读取xml,获取根目录Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//获取第一本书Element bookEle = root.element("书");//方式一//Attribute attr = bookEle.attribute(0);//方式二Attribute attr = bookEle.attribute("出版社");attr.setValue("人民出版社");System.out.println(attr.getName()+":"+attr.getValue());//方式三//String value = bookEle.attributeValue("出版社");//System.out.println(value);//将更新的document写入到xml文档中XMLUtils.write2Xml(doc, "book.xml");}private static void addAttr() {//创建解析器,读取xml,获取根目录Document doc = XMLUtils.getDoc("book.xml");Element root = doc.getRootElement();//获取第一本书Element bookEle = root.element("书");/*//方法一//创建一个游离的属性Attribute attr = DocumentHelper.createAttribute(bookEle, "出版社", "清华大学出版社");//将游离的属性挂载到第一本书上bookEle.add(attr);*///方法二//在第一本书上直接添加属性bookEle.addAttribute("版次","1.0");//将更新的document写入到xml文档中XMLUtils.write2Xml(doc, "book.xml");}}
    

大数据WEB阶段(一)XML文件的操作相关推荐

  1. 大数据WEB阶段 Js常用的页面操作

    window.location.reload();//刷新 window.history.go(1);//前进 window.history.go(-1);//返回+刷新 window.history ...

  2. 大数据WEB阶段 TransientDateAccessResourceException

    大数据WEB阶段 TransientDateAccessResourceException 一 . 分析 如果数据库保存的字段有时间 , 但是没有给该字段赋值时 ,则该字段默认是0000-00-00 ...

  3. 大数据WEB阶段Maven安装配置与使用

    Maven 零.目录 Maven简介 Maven 的安装与配置 创建Maven工程 创建maven-web工程 搭建私服 使用本地资源库 阿里私服 maven命令 上传本地工程到私服中 maven-w ...

  4. 大数据WEB阶段总结

    一.概述 HTTP协议 web容器 - Tomcat 静态web资源 - 本质上是文件 html css js 图片 音频 视频 flash- 动态web资源 - 本质上是程序 Servelt JSP ...

  5. 大数据WEB阶段(十三)JSP(二)JSP标签、EL表达式、JSTL

    JSP标签.EL表达式.JSTL (一)JSP标签技术 一.JSP标签技术概述 jsp本质上是一种动态web资源开发技术 , 看起来像是html , 但其中可以写java代码 , 非常方便用来开发动态 ...

  6. 大数据WEB阶段(十三)JSP(一)JSP基础、JSP指令详解、四大域九大隐式对象总结

    JSP基础.指令.四大作用域九大隐式对象总结 (一)JSP基础 一.JSP概述 jsp其实是java动态页面技术 HTML可以用来组织页面但是HTML是一种静态web资源技术无法嵌入动态数据. Ser ...

  7. 大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式

    Response.ServletConfig.ServletContext.资源跳转三种方式 - (一)Response 一.Response概述 在doGet和doPost方法的参数中,HttpSe ...

  8. 大数据WEB阶段(九)Servlet+Request

    Servlet与Request 一.概述 Servlet 是sun公司提供的一门用于开发动态web资源的技术 按照这套规范写出来的servlet可以放置在web应用中在servlet容器中运行 . 开 ...

  9. 大数据WEB阶段 Maven与SSM框架整合

    Maven整合SSM框架 零. 目录 Maven整合SSM 常见的问题 以及一些优化 一. Maven整合SSM 创建webapp工程 修改jdk和编译器 配置pom.xml文件 并在pom.xml文 ...

最新文章

  1. MySQL中字段约束有哪些_mysql字段约束
  2. JavaScript文件中调用AngularJS内部方法或改变$scope变量
  3. hdu 4778 Gems Fight! 状压dp
  4. mysql 不同分区 同时insert_一文看懂mysql数据库分区表概念、类型、适用场景、优缺点及原理...
  5. 报名 | 加密金融生态大咖私享会
  6. STM32启动模式详解
  7. python设计一个函数定义计算并返回n价调和函数_音乐编程语言musicpy教程(第三期) musicpy的基础语法(二)...
  8. java ee的小程序_Java EE应用程序的单片到微服务重构
  9. python如何读取kepsever_python linecache读取过程
  10. 巧用SQL的全局临时表防止用户重复登录
  11. yolov5-detect.py解析与重写
  12. clickhouse 数据存储
  13. 学生环境保护绿色家园 WEB静态网页作业模板 大学生环境保护网页代码 dreamweaver网页设计作业制作 dw个人网页作业成品
  14. 谁说大象不能跳舞--myeclipse 优化
  15. java 方法互斥_java – 互斥方法
  16. 国务院发文,完善身份认证、电子印章等应用,加强数字政府建设
  17. 详解ELF重定向原理
  18. 锐捷交换机配置MSTP以及VRRP
  19. CPU和cache的区别、RAM和ROM的区别、常见的名称缩写
  20. 解决Themida加壳程序在VMware虚拟机无法运行问题TheMida Soory, this application cannt run under a Virtual Machine---

热门文章

  1. MVC后台创建Json(List),前台接受并循环读取
  2. PIManager V1.0 Release -[2007-06-05]
  3. python3.10_概述 — Python 3.10.0a2 文档
  4. linux拷贝大量文件时有什么方法可以效验文件有没有损坏,使用linux的cp命令复制文件后验证文件是否一致的方法...
  5. 如何动态修改uri_maven如何动态统一修改版本号
  6. 示波器测ab相_独有功能,剑走偏锋,示波器鲜为人知的10大特异功能|测试能力篇...
  7. SAP HANA中的SLT简介
  8. 《ASP.NET MVC企业实战》(一) MVC开发前奏
  9. VMware如何进入安全模式
  10. window安装mysql5.7解压版(解决乱码问题)