XML语法
一、XML简介
(一)定义
XML(eXtensible Markup Language,可扩展标记语言)是一种简单的文本格式,用于标记电子文件使其具有结构性的标记语言。它与HTML(HyperText Markup Language,超文本标记语言)类似,但XML主要用于数据的存储和传输,而HTML主要用于网页的显示。
(二)用途
- 数据交换:XML可以作为一种通用的数据格式,用于不同系统之间的数据交换。例如,在企业级应用中,不同部门的系统可能使用不同的数据库和编程语言,通过XML可以方便地将数据以统一的格式进行传输和共享。
- 配置文件:很多软件和应用程序使用XML文件作为配置文件。例如,Java的Spring框架使用XML文件来配置Bean的依赖关系。
- 文档存储:XML可以用来存储具有层次结构的文档数据。例如,一些电子图书可能会使用XML格式来存储内容,方便对章节、段落等进行标记和处理。
(三)特点
- 可扩展性:用户可以根据需要定义自己的标记。例如,你可以定义一个
<book>标记来表示一本书,而HTML中并没有这样的标记。 - 自描述性:XML文件中的标记可以直观地表示数据的含义。例如,
<name>John</name>很容易理解为“名字是John”。 - 跨平台性:XML文件是纯文本文件,可以在不同的操作系统和设备之间轻松传输和解析。
二、XML语法教程
(一)基本结构
一个XML文件通常包含以下部分:
- 声明:XML文件的第一行通常是XML声明,用于指定XML版本和字符编码。例如:
<?xml version="1.0" encoding="UTF-8"?>version="1.0"表示XML版本为1.0。encoding="UTF-8"表示文件的字符编码是UTF-8。
- 根元素:XML文件必须有一个根元素,根元素是整个文档的最外层元素。例如:
在这个例子中,<library><!-- 图书馆的内容 --> </library><library>就是根元素。 - 子元素和属性:根元素可以包含子元素,子元素也可以包含子元素,从而形成一个层次结构。元素还可以有属性,用于描述元素的额外信息。例如:
<library><book id="1"><title>XML教程</title><author>Kimi</author><price>30</price></book><book id="2"><title>Java编程</title><author>John Doe</author><price>50</price></book> </library><book>是<library>的子元素。<title>、<author>和<price>是<book>的子元素。id="1"是<book>元素的属性,用于标识书籍的编号。
(二)元素规则
- 元素名称:
- 元素名称可以包含字母、数字、下划线等字符,但不能以数字开头。
- 元素名称是大小写敏感的,例如
<Book>和<book>是不同的元素。
- 空元素:如果一个元素没有内容,可以使用空元素的形式。例如:
等同于:<book id="3"/><book id="3"></book> - 嵌套规则:元素可以嵌套,但不能交叉嵌套。例如,以下代码是错误的:
因为<book><title><author>John Doe</author></title> </book><author>元素被错误地嵌套在<title>元素中,而<title>和<author>应该是同级元素。
(三)属性规则
- 属性定义:属性用于为元素提供额外的信息,属性名和属性值之间用等号连接,属性值必须用引号(单引号或双引号)括起来。例如:
<book id="1" category="编程"><title>XML教程</title><author>Kimi</author> </book>id="1"和category="编程"是<book>元素的属性。
- 属性值的引号:属性值可以用双引号或单引号括起来,但不能混用。例如:
如果属性值中包含引号,可以使用转义字符。例如:<book id='1' category="编程"/><book id="1" description="This book is 'great'"/>
(四)注释
XML文件中可以添加注释,注释的内容不会被解析器处理。注释的语法是:
<!-- 这是注释内容 -->
例如:
<library><!-- 图书馆的书籍列表 --><book id="1"><title>XML教程</title><!-- 作者信息 --><author>Kimi</author></book>
</library>
(五)特殊字符
在XML文件中,有些字符有特殊的含义,如果需要在内容中使用这些字符,需要使用实体引用。常见的特殊字符及其实体引用如下:
<(小于号):<>(大于号):>&(与号):&"(双引号):"'(单引号):'
例如:
<book id="1"><title>XML & HTML教程</title>
</book>
(六)文档类型定义(DTD)
文档类型定义(DTD)用于定义XML文件的结构和规则。通过DTD,可以指定哪些元素是必需的,哪些元素可以包含哪些子元素,以及元素的属性等。DTD可以嵌入在XML文件中,也可以作为外部文件引用。
-
内部DTD:嵌入在XML文件中。例如:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE library [<!ELEMENT library (book+)><!ELEMENT book (title, author, price)><!ELEMENT title (#PCDATA)><!ELEMENT author (#PCDATA)><!ELEMENT price (#PCDATA)><!ATTLIST book id ID #REQUIRED> ]> <library><book id="1"><title>XML教程</title><author>Kimi</author><price>30</price></book> </library><!DOCTYPE library [...]>定义了文档类型。<!ELEMENT library (book+)>表示<library>元素可以包含一个或多个<book>元素。<!ELEMENT book (title, author, price)>表示<book>元素必须包含<title>、<author>和<price>子元素,且顺序不能改变。<!ATTLIST book id ID #REQUIRED>表示<book>元素必须有一个id属性,且id属性的值是唯一的。
-
外部DTD:将DTD定义在一个单独的文件中,然后在XML文件中引用。例如,创建一个
library.dtd文件:<!ELEMENT library (book+)> <!ELEMENT book (title, author, price)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST book id ID #REQUIRED>然后在XML文件中引用:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE library SYSTEM "library.dtd">
<library><book id="1"><title>XML教程</title><author>Kimi</author><price>30.00</price></book><book id="2"><title>Java编程</title><author>John Doe</author><price>50.00</price></book><book id="3"><title>Python基础</title><author>Jane Smith</author><price>40.00</price></book>
</library>
(七)XML命名空间(Namespaces)
1. 什么是命名空间?
命名空间用于区分不同来源的XML元素和属性,避免名称冲突。例如,两个不同的XML文档可能都有一个<book>元素,但它们的含义可能完全不同。通过命名空间,可以明确区分这些元素。
2. 命名空间的语法
命名空间通过xmlns属性定义,通常包含一个前缀和一个URI(统一资源标识符)。例如:
<library xmlns:books="http://example.com/books"><books:book id="1"><books:title>XML教程</books:title><books:author>Kimi</books:author></books:book>
</library>
xmlns:books="http://example.com/books":定义了一个命名空间,前缀为books,URI为http://example.com/books。books:book、books:title、books:author:使用命名空间前缀来区分这些元素。
3. 默认命名空间
如果没有指定前缀,可以定义一个默认命名空间。例如:
<library xmlns="http://example.com/books"><book id="1"><title>XML教程</title><author>Kimi</author></book>
</library>
xmlns="http://example.com/books":定义了一个默认命名空间。- 所有未指定前缀的元素都属于这个默认命名空间。
4. 命名空间的作用
- 避免冲突:当XML文档中包含来自不同来源的元素时,命名空间可以避免名称冲突。
- 模块化:可以将不同的模块或功能用不同的命名空间区分。
(八)XML Schema(XSD)
XML Schema是一种更强大的方式来定义XML文档的结构和约束,它比DTD更灵活,支持数据类型定义、复杂数据结构等。
1. 定义XML Schema
XML Schema文件通常以.xsd为扩展名。例如,创建一个library.xsd文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="library"><xs:complexType><xs:sequence><xs:element name="book" maxOccurs="unbounded"><xs:complexType><xs:sequence><xs:element name="title" type="xs:string"/><xs:element name="author" type="xs:string"/><xs:element name="price" type="xs:decimal"/></xs:sequence><xs:attribute name="id" type="xs:string" use="required"/></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element>
</xs:schema>
2. 在XML文件中引用XML Schema
<?xml version="1.0" encoding="UTF-8"?>
<library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="library.xsd"><book id="1"><title>XML教程</title><author>Kimi</author><price>30.00</price></book>
</library>
xsi:noNamespaceSchemaLocation="library.xsd":指定XML Schema文件的位置。
3. XML Schema的优势
- 数据类型支持:支持丰富的数据类型,如
xs:string、xs:decimal、xs:date等。 - 复杂结构定义:可以定义复杂的元素结构,包括序列、选择等。
- 可扩展性:比DTD更灵活,支持更多功能。
(九)XML解析
XML文件需要通过解析器(Parser)来读取和处理。常见的解析方式有DOM解析和SAX解析。
1. DOM解析(Document Object Model)
DOM解析器将整个XML文档加载到内存中,形成一个树状结构,方便随机访问和修改。例如,在JavaScript中可以使用DOM解析:
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlString, "text/xml");
const books = xmlDoc.getElementsByTagName("book");
for (let i = 0; i < books.length; i++) {console.log(books[i].getElementsByTagName("title")[0].childNodes[0].nodeValue);
}
2. SAX解析(Simple API for XML)
SAX解析器逐行读取XML文件,事件驱动,适合处理大型文件,但不支持随机访问。例如,在Java中可以使用SAX解析:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(new File("library.xml"), new DefaultHandler() {public void startElement(String uri, String localName, String qName, Attributes attributes) {System.out.println("Start Element: " + qName);}
});
(十)XML与HTML的区别
| 特性 | XML | HTML |
|---|---|---|
| 用途 | 用于数据存储和传输,强调数据的结构化和可扩展性。 | 用于网页显示,强调内容的展示和格式化。 |
| 标签定义 | 用户自定义标签,没有固定的标签集合。 | 有固定的标签集合,如<div>、<p>、<a>等。 |
| 属性限制 | 属性值必须用引号括起来,大小写敏感。 | 属性值可以不用引号,大小写不敏感。 |
| 错误处理 | 如果XML文件不符合语法或结构,解析器会报错。 | 浏览器会尽量忽略HTML中的错误,继续显示页面。 |
| 数据类型 | 支持多种数据类型,通过XML Schema定义。 | 主要用于文本和HTML元素的显示,不支持复杂的数据类型定义。 |
(十一)XML的优缺点
优点:
- 可扩展性强:用户可以根据需要定义自己的标签和结构。
- 跨平台:纯文本格式,易于在不同系统之间传输和解析。
- 自描述性:标记直观,易于理解和维护。
- 与多种技术兼容:与HTML、XSLT、XPath等技术结合使用,功能强大。
缺点:
- 冗余性:文件通常较大,因为需要包含大量的标记。
- 解析效率低:DOM解析需要加载整个文档到内存,可能对性能有影响。
- 学习曲线:需要掌握一定的语法和规范,尤其是XML Schema等高级功能。
(十二)XML的应用示例
1. 数据交换
在Web服务中,XML常用于SOAP协议的数据传输。例如:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"><soap:Body><GetBookDetails xmlns="http://example.com/books"><bookId>1</bookId></GetBookDetails></soap:Body>
</soap:Envelope>
2. 配置文件
在Java的Spring框架中,使用XML文件配置Bean:
<beans><bean id="bookService" class="com.example.BookService"/>
</beans>
3. 文档存储
一些电子文档使用XML格式存储内容,方便结构化处理。
Qt中的XML功能、作用、优缺点
一、Qt中的XML功能
Qt提供了多种方式来处理XML文件,主要包括以下几种方法:
-
QDomDocument(DOM解析):
- 将整个XML文档加载到内存中,构建一个树状结构,允许随机访问和修改文档的任意部分。
- 适用于小型且结构简单的XML文件,尤其是需要频繁修改和操作文档结构的场景。
-
QXmlStreamReader/QXmlStreamWriter(流式解析):
- 基于流的方式逐个处理XML文档的元素,不需要将整个文档加载到内存中。
- 适合处理大型XML文件,尤其是对内存消耗有限制的场景。
-
QtXmlPatterns(XQuery和XPath支持):
- 提供对复杂查询和数据处理的支持,适用于需要进行复杂筛选和转换的场景。
二、Qt中XML的作用
- 数据存储和配置管理:
- XML文件常用于存储应用程序的配置信息,Qt通过DOM或流式解析方式可以方便地读取和修改这些配置。
- 数据交换:
- 在跨平台或跨语言的应用中,XML作为数据交换格式,Qt可以高效地解析和生成XML文档。
- 文档处理:
- Qt支持对XML文档的结构化处理,包括读取、修改和生成,适用于需要对文档进行复杂操作的场景。
三、Qt中XML的优缺点
(一)QDomDocument(DOM解析)
- 优点:
- 提供完整的文档树结构,支持随机访问和修改。
- API丰富,操作灵活,适合复杂文档的处理。
- 缺点:
- 需要将整个文档加载到内存中,内存占用较高,不适合处理大型文件。
(二)QXmlStreamReader/QXmlStreamWriter(流式解析)
- 优点:
- 内存效率高,适合处理大型文件。
- 解析速度快,逐个处理元素,适合顺序读取。
- 缺点:
- 不支持随机访问,只能顺序遍历。
- 不支持直接修改文档。
(三)QtXmlPatterns
- 优点:
- 支持复杂查询和数据处理,适合需要使用XPath和XQuery的场景。
- 缺点:
- 性能相对较低,适合对查询功能要求较高的场景。
四、为什么选择Qt的XML功能?
- 灵活性:
- Qt提供了多种解析方式,开发者可以根据需求选择DOM、流式解析或XPath等方法。
- 高效性:
- 流式解析方式(QXmlStreamReader/QXmlStreamWriter)特别适合处理大型文件,避免内存溢出。
- 易用性:
- Qt的XML模块提供了简洁易用的API,开发者可以快速上手。
- 跨平台性:
- Qt的XML功能在不同平台上保持一致,方便跨平台开发。
五、总结
Qt的XML功能适用于多种场景,开发者可以根据需求选择合适的解析方式。对于小型文件和复杂操作,DOM解析是理想选择;对于大型文件和高效处理,流式解析更为适合。
相关文章:
XML语法
一、XML简介 (一)定义 XML(eXtensible Markup Language,可扩展标记语言)是一种简单的文本格式,用于标记电子文件使其具有结构性的标记语言。它与HTML(HyperText Markup Language,超…...
游戏引擎学习第152天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾昨天的内容 这个节目展示了我们如何从零开始制作一款完整的游戏。我们不使用任何游戏引擎或库,而是从头开始创建一款游戏,整个开发过程都会呈现给大家。你将能够看到每一行代码的编写,了解…...
考研数学非数竞赛复习之Stolz定理求解数列极限
在非数类大学生数学竞赛中,Stolz定理作为一种强大的工具,经常被用来解决和式数列极限的问题,也被誉为离散版的’洛必达’方法,它提供了一种简洁而有效的方法,使得原本复杂繁琐的极限计算过程变得直观明了。本文&#x…...
故障诊断——neo4j入门
文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客:https://www.cnblogs.com/nhdlb/p/18703804,使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…...
【CXX】6.2 str — rust::Str
Rust::Str 公共 API // rust/cxx.hclass Str final { public:Str() noexcept;Str(const Str &) noexcept;Str(const String &) noexcept;// 如果输入不是 UTF-8,抛出 std::invalid_argument 异常。Str(const std::string &);Str(const char *);Str(con…...
【JavaWeb】快速入门——HTMLCSS
文章目录 一、 HTML简介1、HTML概念2、HTML文件结构3、可视化网页结构 二、 HTML标签语法1、标题标签2、段落标签3、超链接4、换行5、无序列表6、路径7、图片8、块1 盒子模型2 布局标签 三、 使用HTML表格展示数据1、定义表格2、合并单元格横向合并纵向合并 四、 使用HTML表单收…...
unordered_set 的常用函数
在 C 的标准库中,std::unordered_set 是基于哈希表实现的哈希集合。下面介绍这种语言里哈希集合的常用函数。 C std::unordered_set 1. 元素操作 insert 功能:向哈希集合中插入元素。如果元素已经存在,则不会重复插入。示例代码:…...
若依框架-给sys_user表添加新字段并获取当前登录用户的该字段值
目录 添加字段 修改SysUser类 修改SysUserMapper.xml 修改user.js 前端获取字段值 添加字段 若依框架的sys_user表是没有age字段的,但由于业务需求,我需要新添加一个age字段: 修改SysUser类 添加age字段后,要在SysUser类 …...
前端监测窗口尺寸和元素尺寸变化的方法
前端监测窗口尺寸变化和元素尺寸变化的方法 window.resize 简介 window.resize事件是浏览器提供的一种事件,用于监听窗口大小的改变。这意味着当用户调整浏览器窗口大小时,相关的JavaScript代码将被触发执行。这为开发者提供了一种机制,可…...
angular中下载接口返回文件
目录 一、URL.createObjectURL() 一、URL.createObjectURL() createObjectURL属于js的原生方法,位于window.URL上,用于将Blob或者File文件转换为可以临时的URL地址进行显示 **注意**:Angular 的 HttpClient 默认将响应解析为 JSON 对象16。…...
ubuntu 部署deepseek
更新 apt update 升级 apt upgrade 格式化硬盘 mkfs.ext4 /dev/sdb 安装nginx 查看端口 一、安装Ollama Ollama是一个开源的大型语言模型(LLM)推理服务器,为用户提供了灵活、安全和高性能的语言模型推理解决方案。 ollama/docs/linux.m…...
【每日学点HarmonyOS Next知识】拖拽调整列表顺序、tab回弹、自定义弹窗this、状态变量修饰枚举
1、HarmonyOS 功能实现(拖拽调整列表顺序)? 可参考: import curves from ohos.curves; import Curves from ohos.curvesEntry Component struct ListItemExample {State private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]…...
MySQL库和表的操作详解:从创建库到表的管理全面指南
目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…...
PyTorch 系列教程:使用CNN实现图像分类
图像分类是计算机视觉领域的一项基本任务,也是深度学习技术的一个常见应用。近年来,卷积神经网络(cnn)和PyTorch库的结合由于其易用性和鲁棒性已经成为执行图像分类的流行选择。 理解卷积神经网络(cnn) 卷…...
Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上
Docker下ARM64架构的源码编译Qt5.15.1,并移植到开发板上 1、环境介绍 QT版本:5.15.1 待移植环境: jetson nano 系列开发板 aarch64架构(arm64) 编译环境: 虚拟机Ubuntu18.04(x86_64) 2、…...
Java 大视界 -- Java 大数据中的数据可视化大屏设计与开发实战(127)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
starrocks批量启停脚本
#!/bin/bash # 定义 StarRocks 安装目录 STARROCKS_HOME"/path/to/starrocks" # 定义 FE 和 BE 节点列表 FE_NODES("fe_node1_ip" "fe_node2_ip" "fe_node3_ip") BE_NODES("be_node1_ip" "be_node2_ip" "be_…...
「Unity3D」UGUI将元素固定在,距离屏幕边缘的某个比例,以及保持元素自身比例
在不同分辨率的屏幕下,UI元素按照自身像素大小,会发生位置与比例的变化,本文仅利用锚点(Anchors)使用,来实现UI元素,固定在某个比例距离的屏幕边缘。 首先,将元素的锚点设置为中心&…...
4.3 数组和集合的初始及赋值
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商…...
Deep research深度研究:ChatGPT/ Gemini/ Perplexity/ Grok哪家最强?(实测对比分析)
目前推出深度研究和深度检索的AI大模型有四家: OpenAI和Gemini 的deep research,以及Perplexity 和Grok的deep search,都能生成带参考文献引用的主题报告。 致力于“几分钟之内生成一份完整的主题调研报告,解决人力几小时甚至几天…...
关于sqlalchemy的ORM的使用
关于sqlalchemy的ORM的使用 二、创建表三、使用数据表、查询记录三、批量插入数据四、关于with...as...:的使用 二、创建表 使用Mapped来映射字段 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker,Mapped,mapped_columnBa…...
【leetcode hot 100 148】排序序列
解法一:(双重循环)第一个循环head,逐步将head的node加入有序列表;第二个循环在有序列表中找到合适的位置,插入node。 /*** Definition for singly-linked list.* public class ListNode {* int val;* …...
3-001:MySQL 中的回表是什么?
1. 什么是回表? 回表(Back to Table) 指的是 在使用非聚簇索引(辅助索引)查询时,MySQL 需要 先通过索引找到主键 ID,然后再回到主键索引(聚簇索引)查询完整数据…...
单片机设计暖脚器研究
标题:单片机设计暖脚器研究 内容:1.摘要 本文聚焦于基于单片机设计暖脚器的研究。背景方面,在寒冷季节,暖脚器能有效改善脚部寒冷状况,提升人们的舒适度,但传统暖脚器存在功能单一、温控不准确等问题。目的是设计一款智能、高效且…...
【Linux】在VMWare中安装Ubuntu操作系统(2025最新_Ubuntu 24.04.2)#VMware安装Ubuntu实战分享#
今天田辛老师为大家带来一篇关于在VMWare虚拟机上安装Ubuntu系统的详细教程。无论是学习、开发还是测试,虚拟机都是一个非常实用的工具,它允许我们在同一台物理机上运行多个操作系统。Ubuntu作为一款开源、免费且用户友好的Linux发行版,深受广…...
AutoGen学习笔记系列(十三)Advanced - Logging
这篇文章瞄的是AutoGen官方教学文档 Advanced 章节中的 Logging 篇章,介绍了怎样在使用过程中添加日志信息,其实就是使用了python自带的日志库 logging。 官网链接:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-g…...
scrcpy pc机远程 无线 控制android app 查看调试log
背景: 公司的安卓机,是那种大屏幕的连接usb外设的。不好挪动,占地方,不能直接连接pc机上的android stduio来调试。 所以从网上找了一个python adb.exe控制器,可以局域网内远程控制开发的app,并在android stduio上看…...
UE5.5 Niagara发射器更新属性
发射器属性 在 Niagara 里,Emitter 负责控制粒子生成的规则和行为。不同的 Emitter 属性决定了如何发射粒子、粒子如何模拟、计算方式等。 发射器 本地空间(Local Space) 控制粒子是否跟随发射器(Emitter)移动。 ✅…...
深度剖析Redis:双写一致性问题及解决方案全景解析
在高并发场景下,缓存与数据库的双写一致性是每个开发者必须直面的核心挑战。本文通过5大解决方案,带你彻底攻克这一技术难关! 一、问题全景图:当缓存遇到数据库 1.1 典型问题场景 // 典型问题代码示例 public void updateProduc…...
MongoDB备份与还原
备份恢复工具介绍 1)mongoexport/mongoimport 2)mongodump/mongorestore 备份工具区别 mongoexport/mongoimport 导入/导出的是JSON格式或者CSV格式 mongodump/mongorestore 导入/导出的是BSON格式。二进制方式,速度快 1)…...
