XML概述
一、XML由来
(一)什么是XML?
咱们先拆解名字:XML是“可扩展的标记语言”,核心就两个关键词——标记语言+可扩展。
1. 先懂“标记语言”:像给数据贴标签
你肯定见过HTML(就是做网页的那个),它和XML是“亲戚”,都是用<>这种标签来包裹内容的,比如:
- HTML里写
<p>我是段落</p>,<p>就是固定的“段落标签”; - XML也这么写,但标签能自己定,比如想存水果信息,就可以写
<苹果>红富士</苹果>,想存快递信息,就写<快递单号>123456</快递单号>。
简单说:标记语言就是用自定义/固定的标签,把数据“框”起来,让数据结构清晰,不管是人还是电脑都能看懂。
2. “可扩展”:标签想怎么定就怎么定(这是XML的核心)
HTML的标签是死的,比如只能用<div>``<p>``<img>这些,改不了;但XML的标签完全由你说了算——你做电商就定<商品>``<价格>,做通讯录就定<姓名>``<手机号>,没有任何限制,这就是“可扩展”。
3. 版本的事儿:不用管1.1,就学1.0就行
XML是由W3C(后面会说)制定的,1998年出了1.0版本,2004年又出了1.1版本。但1.1有个大坑:和1.0不兼容(就像安卓APP装不上苹果手机),所以没人用;同年W3C又更了1.0的第三版,这版兼容老版本,也是现在所有人都在用的,咱们学这个就行。
补充:XML的“出身”
它是SGML(标准通用标记语言)的“简化版”,SGML太复杂,普通人用不上,所以就简化出XML,专门用来做结构化的数据处理。
(二)W3C是个啥组织?不是官方,但说话超管用
1. 基本情况:Web界的“行业老大”
W3C翻译过来是“万维网联盟”,1994年10月成立的,不是政府官方机构(比如工信部),更像是全球互联网领域的“行业协会”——聚集了各大科技公司(谷歌、微软、阿里等)、专家,一起研究Web技术。
2. 核心工作:制定Web的“规矩”
它的目标是把互联网的技术统一起来,让不同网站、不同系统之间能互通。这么多年下来,已经出了90多份技术规范,比如咱们熟悉的HTML、XML、CSS、HTTP这些,都是它定的“规矩”。
3. 标准的“含金量”:虽叫“建议”,实则是“行业法则”
W3C自己说,它发布的规范只是“推荐标准”(相当于“建议大家这么做”),但因为它的权威性,这些“建议”最后都成了全世界公认的标准——比如你写HTML不按W3C的规范来,浏览器就可能显示不正常,所有开发者都得按它的规矩来。
W3C就是Web技术的“定规矩的人”,不是官方,但全行业都听它的。
二、XML的作用
XML(可扩展标记语言)的核心作用可总结为三大核心场景,且各有明确的价值定位:
- 配置文件(最主流用途):作为程序/系统的配置载体,凭借其结构化、可读性强、可扩展的特性,能清晰定义程序的参数、模块关联、运行规则等(如Java的Spring配置、Tomcat服务器配置),无需修改代码即可调整程序行为,降低维护成本。
- 跨语言数据交换:作为通用的数据格式,独立于编程语言和平台,可在不同语言(如Java、Python、C#)、不同系统间标准化传输和解析数据,是早期异构系统数据交互的核心媒介(如WebService接口数据传输)。
- 轻量级数据存储:以结构化标签组织数据,可作为小型、简单场景的“轻量数据库”,直接存储少量结构化数据(如本地应用的用户信息、简单业务数据),无需依赖复杂数据库系统,实现快速存取和管理。
XML的核心价值在于结构化、可扩展、跨平台,既适配程序配置的灵活调整需求,也满足异构系统的数据互通,还能支撑简单场景的数据存储,是兼具可读性与通用性的标记语言。
三、XML与HTML比较
第一点:HTML是“固定菜单”,XML是“空白笔记本”
HTML:元素固定=餐厅里的“固定菜单”
HTML的元素(比如<div>、<p>、<img>、<h1>)就像餐厅里印好的固定菜单,菜名都是定死的:只能点“红烧肉”“鱼香肉丝”“拍黄瓜”,没有的菜你点不了,老板也不会给你做。
比如写HTML只能用这些固定标签:
<!-- 只能用HTML规定好的标签,不能自己造 --><h1>我的首页</h1><!-- 一级标题,固定标签 --><p>这是一段文字</p><!-- 段落,固定标签 --><imgsrc="图片.jpg"><!-- 图片,固定标签 -->哪怕你想表达“我的宠物猫”,也只能用现有标签凑:<p>我的宠物猫:橘猫</p>,没法自己造一个<宠物猫>标签——HTML不认自定义的标签,写了也白写。
XML:自定义元素=空白笔记本,想写啥就写啥
XML的元素完全是自定义的,就像你拿了一本空白笔记本,想写什么标题、什么分类,全由你定。
比如你想记录宠物信息,直接造标签就行:
<!-- 自己定义<宠物猫>、<名字>、<品种>这些标签,XML都认 --><宠物记录><宠物猫><名字>橘子</名字><品种>橘猫</品种><年龄>2岁</年龄></宠物猫><宠物狗><名字>旺财</名字><品种>金毛</品种><年龄>3岁</年龄></宠物狗></宠物记录>哪怕你想造<打工人>``<工资>``<摸鱼时长>这些奇奇怪怪的标签,XML也完全接受——它不管你标签叫啥,只认“你定义的结构”,这就是“自定义元素”的核心。
第二点:HTML是“自带翻译的说明书”,XML是“无翻译的外文手稿”
HTML:浏览器自动解析=说明书有自带的翻译,拿过来就能看懂
HTML是给浏览器(Chrome、Edge)用的,浏览器天生就认识所有HTML标签,能自动解析并展示成网页:
- 看到
<h1>就知道要显示成大号粗体标题; - 看到
<img>就知道要加载并显示图片; - 你只需要写HTML代码,打开浏览器就能直接看到效果,不用自己写任何“解析代码”。
就像你拿到一本带中文翻译的英文说明书,不用自己查字典,直接就能看懂怎么用。
XML:解析器要自己写=拿到纯外文手稿,得自己学外语翻译
XML的标签是你自定义的,没有任何工具天生认识这些标签——比如你定义了<宠物猫>,电脑根本不知道这是啥意思,得你自己写“解析代码”告诉电脑:
“找到<宠物猫>标签,把里面的<名字>内容取出来,显示在屏幕上”。
就像你拿到一本纯法语的手稿,没有翻译,得自己学法语、自己逐字翻译才能看懂内容。
比如想读取上面XML里的“橘子”,得写解析代码(类似之前讲的XML解析逻辑),告诉程序:“先找<宠物记录>,再找里面的<宠物猫>,再取<名字>里的文字”——这部分代码得自己写,没有现成的“通用解析器”直接用。
第三点:HTML是“专用工具(菜刀)”,XML是“通用工具(瑞士军刀)”
HTML:只能做网页=菜刀只能切菜
HTML的唯一使命就是“描述网页的结构和内容”,让浏览器能展示网页——它除了做网页,啥也干不了。
比如你想记录物流信息、存储订单数据、传递接口数据,用HTML就完全不合适,因为它的标签都是为“网页展示”设计的,没法清晰表达这些复杂的结构化数据。
就像菜刀只能用来切菜,你想用它拧螺丝、开啤酒、剪绳子,根本做不到。
XML:能做的事多=瑞士军刀能切菜、拧螺丝、开啤酒
XML因为能自定义标签、能表达结构化信息,用途特别广:
- 存储数据:比如电商平台存订单(<订单号>、<商品>、<收货人>);
- 传递数据:比如不同系统之间交换数据(比如物流系统给电商系统传快递信息);
- 配置文件:比如框架的配置(Spring的xml配置文件);
- 描述数据:比如定义接口返回的格式(告诉对方“我返回的<用户ID>是啥,<手机号>是啥”)。
就像瑞士军刀,既能切菜(类似HTML做简单展示),还能拧螺丝、开啤酒、剪绳子,适配各种场景。
总结一下
| 特性 | HTML | XML |
|---|---|---|
| 元素规则 | 标签固定(只能用规定好的) | 标签自定义(想造啥标签就造啥) |
| 解析方式 | 浏览器自动解析(不用自己写代码) | 需自己写解析器(告诉程序标签啥意思) |
| 适用场景 | 仅用于制作网页(专用) | 存储/传递/配置数据等(通用) |
一句话:HTML是“网页专属的固定格式”,拿来就能做网页;XML是“万能的自定义格式”,能装各种数据,但得自己写代码解析。
四、XML和properties(属性文件)比较
第一点:属性文件是“购物清单”,XML是“家庭账本”
属性文件(properties):只能存“平面信息”
平面信息就像只有“键-值”的简单清单,只能一对一,没法分层、没法有复杂结构。
比如你写个.properties文件,内容只能是这样:
# 购物清单.properties 苹果=5个 牛奶=2箱 面包=3袋它的特点是:只有“名字=值”这一种格式,所有内容都在同一层,没法表达“谁买的、什么时候买的、哪个超市买的”这些关联信息——比如你想说明“妈妈买的苹果,在沃尔玛买的,花了20块”,用properties就只能硬凑:
妈妈_苹果_超市=沃尔玛 妈妈_苹果_价格=20元又乱又不直观,本质还是“一对一”的扁平结构,没法体现“苹果属于妈妈的采购、关联超市和价格”这种层级/关联关系。
XML:能存“结构化信息”
结构化信息就像带分类、分层、关联的账本,能把复杂关系说清楚。
还是上面的例子,XML可以这么写:
<!-- 家庭账本.xml --><采购记录><采购人员>妈妈</采购人员><商品><名称>苹果</名称><数量>5个</数量><购买地点>沃尔玛</购买地点><价格>20元</价格></商品><商品><名称>牛奶</名称><数量>2箱</数量><购买地点>家乐福</购买地点><价格>40元</价格></商品></采购记录>你看:
- 有层级:“商品”是“采购记录”的子内容,“名称/数量”又是“商品”的子内容;
- 有结构:能清晰关联“妈妈买的苹果”对应的超市和价格,还能批量放多个商品;
- 能扩展:想加“购买时间”,直接在<商品>里加一行<时间>2025-12-16</时间>就行,不影响整体结构。
简单说:properties只能记“啥是啥”,XML能记“啥属于啥、啥关联啥”。
第二点:解析properties是“查字典”,解析XML是“拆快递”
解析properties:用Properties类=查现成字典
解析就是“读取文件里的内容并使用”。Java里读properties文件,就像查一本按“拼音首字母排序的字典”,工具给你做好了:
// 读properties的核心代码(超简单)Propertiesprop=newProperties();// 加载文件prop.load(newFileInputStream("购物清单.properties"));// 直接拿值,一行搞定String苹果数量=prop.getProperty("苹果");System.out.println(苹果数量);// 输出:5个Properties类是Java专门为属性文件做的“专属工具”,不用你操心怎么拆内容,直接“问它要啥,它就给啥”,就像你查字典,翻到“苹果”那页,直接看后面的解释就行。
解析XML:复杂=拆带多层包装的快递
XML因为有层级、有结构,解析它就像拆一个层层打包的快递:
- 先拆最外层的箱子(<采购记录>);
- 再拆里面的小盒子(<采购人员>、<商品>);
- 每个小盒子里还有更小的包装(<名称>、<价格>);
- 要是有多个<商品>,还得一个个拆、一个个数。
而且Java里没有“一键读XML”的简单类,你得用DOM、SAX、JDOM这些解析方式,写一堆代码:
// 解析XML的简化代码(实际更复杂)DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();Documentdoc=builder.parse(newFile("家庭账本.xml"));// 找<商品>节点NodeListgoodsList=doc.getElementsByTagName("商品");// 遍历每个商品,再找里面的<名称>、<价格>for(inti=0;i<goodsList.getLength();i++){Nodegoods=goodsList.item(i);ElementgoodsElement=(Element)goods;String名称=goodsElement.getElementsByTagName("名称").item(0).getTextContent();String价格=goodsElement.getElementsByTagName("价格").item(0).getTextContent();System.out.println(名称+":"+价格);}相当于你没有“现成字典”,得自己动手把快递一层一层拆开来,才能拿到里面的东西,步骤多、代码也多。
| 特性 | properties属性文件 | XML文档 |
|---|---|---|
| 存储能力 | 只能存“键=值”的扁平信息(简单) | 能存分层、关联的结构化信息(复杂) |
| 解析难度 | 用Properties类一键读取(超简单) | 要写一堆解析代码(麻烦) |
| 适用场景 | 简单配置(比如数据库密码、端口号) | 复杂数据(比如订单、接口返回数据) |
一句话:简单的“一对一”配置用properties(省事),需要分层/关联的复杂数据用XML(能装),但解析XML得多费点劲。
XML语法
XML的语法核心就一个:严格、规整、有统一规则,不像HTML能“随便写”(比如少个闭合标签也能显示),XML只要语法错一点,程序就解析不了。
一、XML的基本骨架(必须有!)
一个完整的XML文档,得有“声明+根元素”这两个核心,少一个都不合法,先看最基础的完整例子:
<?xml version="1.0" encoding="UTF-8"?><!-- XML声明 --><通讯录><!-- 根元素 --><联系人><!-- 子元素 --><姓名>张三</姓名><手机号>13800138000</手机号><地址>北京市朝阳区</地址></联系人><联系人><姓名>李四</姓名><手机号>13900139000</手机号><地址>上海市浦东新区</地址></