当前位置: 首页 > news >正文

XML学习

XML 概述

XML(Extensible Markup Language)是一种可扩展标记语言,是 SGML 的子集。与 HTML 不同,XML 标签可以由用户自定义,具有极高的灵活性。W3C 于 1998 年发布 XML 1.0 版本,2004 年发布 1.1 版本,但因不向下兼容而未被广泛使用,目前主流仍为 1.0 版本。

XML 的主要作用包括作为程序的配置文件、不同语言之间的数据交换媒介以及作为小型数据库存储数据。与 HTML 相比,XML 的标签是自定义的,需要自定义解析器进行解析,主要用于数据存储、配置和交换。


XML 语法基础

XML 文档声明必须位于第一行第一列,格式如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  • version:必须指定,当前主流为 1.0。
  • encoding:可选,默认为 UTF-8。
  • standalone:可选,表示是否依赖外部约束文件。

XML 元素必须有且仅有一个根元素,元素命名区分大小写,不能以数字或xml开头,不能包含空格。空元素可以简写为<hello/>

属性必须用引号(单引号或双引号)包裹,同一元素中不能有重复属性名。注释格式为<!-- 这是注释 -->

特殊字符需要使用转义字符,例如<转义为&lt;>转义为&gt;。大量特殊字符可以使用 CDATA 区:

<![CDATA[ <a> 这里不需要转义 </a> ]]>

XML 约束:DTD 与 Schema

DTD(Document Type Definition)是一种平面式文档,扩展名为.dtd,用于约束元素、顺序和数量。例如:

<!ELEMENT students (student+)> <!ELEMENT student (name,age,sex)> <!ELEMENT name (#PCDATA)>

Schema(.xsd)本身是 XML 文档,支持数据类型、命名空间和继承等功能,推荐使用 Schema,因其功能更强大且语法统一。


XML 解析技术

DOM 和 SAX 是两种常见的 XML 解析方式。DOM 将 XML 加载为树结构,适合增删改查,但大文件性能较差;SAX 采用事件驱动方式,内存占用小,但只能读取。

DOM4J 是专为 Java 开发者设计的 XML 解析规范,比 DOM 更简洁。常用操作包括读取 XML、获取根元素、遍历子元素以及保存 XML。例如:

SAXReader reader = new SAXReader(); Document doc = reader.read("students.xml"); Element root = doc.getRootElement(); List<Element> students = root.elements(); for (Element stu : students) { String number = stu.attributeValue("number"); String name = stu.elementText("name"); System.out.println(number + " : " + name); }

保存 XML 的示例:

OutputFormat format = new OutputFormat("\t", true); format.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(new FileWriter("out.xml"), format); writer.write(doc); writer.close();

XPath:快速定位 XML 节点

XPath 是一种 XML 查询语言,DOM4J 对其提供了良好支持。常用操作包括:

List<Node> nodes = document.selectNodes("//student[@number='1001']"); Node node = document.selectSingleNode("/students/student[1]"); String value = document.valueOf("//student/name");

常用 XPath 表达式示例:

表达式含义
/persons/person根路径下所有person
//age任意位置的age
//person[1]第一个person
//@id所有id属性
//person[@id='p1']idp1person
http://www.jsqmd.com/news/559875/

相关文章:

  • 百川2-13B-4bits模型加速技巧:OpenClaw任务响应速度提升30%的配置优化
  • 突破百度网盘限速的5个实用技巧:免费高速下载全攻略
  • 在PC上畅玩Switch游戏:Ryujinx模拟器完全指南
  • Emby Premiere免费解锁终极指南:轻松享受高级媒体服务器功能
  • TypeScript 一日速通指南:TypeScript可以做全栈开发吗?
  • 洛雪音乐音源全解析:一站式解锁全网高品质音乐资源
  • Python PDF文本提取终极指南:3分钟掌握pdftotext的完整教程
  • 告别TeamViewer!用RustDesk自建服务器实现跨平台远程控制(Windows/Ubuntu客户端全配置)
  • Agent-S:重新定义人机协作的智能体框架技术解析
  • PP-DocLayoutV3效果实测:低光照/模糊/压缩失真文档的布局识别容错能力
  • OpenClaw安装避坑指南:macOS下对接GLM-4.7-Flash全流程
  • 2026年完全指南:OpenClaw LCM 插件 — 再也不会丢失任何对话
  • MATLAB信号处理实战:用buttord和butter函数搞定巴特沃斯滤波器设计(附完整代码)
  • 终极防撤回解决方案:RevokeMsgPatcher完全攻略
  • 家庭自动化整合:OpenClaw+nanobot控制智能家居的配置方案
  • 2026年哪款工具最稳把AI率降到20%以内?年度实测红黑榜 - 我要发一区
  • 51单片机实战:四键操控LED实现多样动态效果
  • 若依框架下,如何让JimuReport积木报表乖乖认你的登录状态?(附完整前后端代码)
  • 原神帧率解锁指南:突破60帧限制的完整方案
  • 3个核心优势:AsrTools语音转文字全流程解决方案
  • 别光看协议!用Wireshark抓包实战分析PCIe TLP的First DW BE和Last DW BE
  • SenseVoice-Small模型在运维监控中的语音告警应用
  • 如何用ESP32-S3模组实现带屏幕AI小智对话
  • Claude Code 命令行参数实践指南
  • OpenClaw性能对比:nanobot轻量模型vs标准大模型
  • Nano-Banana Studio创意应用:基于服装拆解的虚拟试衣间实现
  • 3步快速搭建SillyTavern:打造沉浸式AI角色扮演体验的终极指南
  • DeepSeek-OCR-2效果展示:复杂表格识别准确率提升30%
  • 3大功能拯救消失的网页:Wayback Machine扩展全方位使用指南
  • 群晖NAS人脸识别功能解锁指南:让旧设备焕发AI新活力