XML语法

一、XML简介

(一)定义

XML(eXtensible Markup Language,可扩展标记语言)是一种简单的文本格式,用于标记电子文件使其具有结构性的标记语言。它与HTML(HyperText Markup Language,超文本标记语言)类似,但XML主要用于数据的存储和传输,而HTML主要用于网页的显示。

(二)用途
  1. 数据交换:XML可以作为一种通用的数据格式,用于不同系统之间的数据交换。例如,在企业级应用中,不同部门的系统可能使用不同的数据库和编程语言,通过XML可以方便地将数据以统一的格式进行传输和共享。
  2. 配置文件:很多软件和应用程序使用XML文件作为配置文件。例如,Java的Spring框架使用XML文件来配置Bean的依赖关系。
  3. 文档存储:XML可以用来存储具有层次结构的文档数据。例如,一些电子图书可能会使用XML格式来存储内容,方便对章节、段落等进行标记和处理。
(三)特点
  1. 可扩展性:用户可以根据需要定义自己的标记。例如,你可以定义一个<book>标记来表示一本书,而HTML中并没有这样的标记。
  2. 自描述性:XML文件中的标记可以直观地表示数据的含义。例如,<name>John</name>很容易理解为“名字是John”。
  3. 跨平台性:XML文件是纯文本文件,可以在不同的操作系统和设备之间轻松传输和解析。

二、XML语法教程

(一)基本结构

一个XML文件通常包含以下部分:

  1. 声明:XML文件的第一行通常是XML声明,用于指定XML版本和字符编码。例如:
    <?xml version="1.0" encoding="UTF-8"?>
    
    • version="1.0"表示XML版本为1.0。
    • encoding="UTF-8"表示文件的字符编码是UTF-8。
  2. 根元素:XML文件必须有一个根元素,根元素是整个文档的最外层元素。例如:
    <library><!-- 图书馆的内容 -->
    </library>
    
    在这个例子中,<library>就是根元素。
  3. 子元素和属性:根元素可以包含子元素,子元素也可以包含子元素,从而形成一个层次结构。元素还可以有属性,用于描述元素的额外信息。例如:
    <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>元素的属性,用于标识书籍的编号。
(二)元素规则
  1. 元素名称
    • 元素名称可以包含字母、数字、下划线等字符,但不能以数字开头。
    • 元素名称是大小写敏感的,例如<Book><book>是不同的元素。
  2. 空元素:如果一个元素没有内容,可以使用空元素的形式。例如:
    <book id="3"/>
    
    等同于:
    <book id="3"></book>
    
  3. 嵌套规则:元素可以嵌套,但不能交叉嵌套。例如,以下代码是错误的:
    <book><title><author>John Doe</author></title>
    </book>
    
    因为<author>元素被错误地嵌套在<title>元素中,而<title><author>应该是同级元素。
(三)属性规则
  1. 属性定义:属性用于为元素提供额外的信息,属性名和属性值之间用等号连接,属性值必须用引号(单引号或双引号)括起来。例如:
    <book id="1" category="编程"><title>XML教程</title><author>Kimi</author>
    </book>
    
    • id="1"category="编程"<book>元素的属性。
  2. 属性值的引号:属性值可以用双引号或单引号括起来,但不能混用。例如:
    <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文件中,有些字符有特殊的含义,如果需要在内容中使用这些字符,需要使用实体引用。常见的特殊字符及其实体引用如下:

  • <(小于号):&lt;
  • >(大于号):&gt;
  • &(与号):&amp;
  • "(双引号):&quot;
  • '(单引号):&apos;

例如:

<book id="1"><title>XML &amp; HTML教程</title>
</book>
(六)文档类型定义(DTD)

文档类型定义(DTD)用于定义XML文件的结构和规则。通过DTD,可以指定哪些元素是必需的,哪些元素可以包含哪些子元素,以及元素的属性等。DTD可以嵌入在XML文件中,也可以作为外部文件引用。

  1. 内部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属性的值是唯一的。
  2. 外部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:bookbooks:titlebooks: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:stringxs:decimalxs: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的区别

特性XMLHTML
用途用于数据存储和传输,强调数据的结构化和可扩展性。用于网页显示,强调内容的展示和格式化。
标签定义用户自定义标签,没有固定的标签集合。有固定的标签集合,如<div><p><a>等。
属性限制属性值必须用引号括起来,大小写敏感。属性值可以不用引号,大小写不敏感。
错误处理如果XML文件不符合语法或结构,解析器会报错。浏览器会尽量忽略HTML中的错误,继续显示页面。
数据类型支持多种数据类型,通过XML Schema定义。主要用于文本和HTML元素的显示,不支持复杂的数据类型定义。

(十一)XML的优缺点

优点:
  1. 可扩展性强:用户可以根据需要定义自己的标签和结构。
  2. 跨平台:纯文本格式,易于在不同系统之间传输和解析。
  3. 自描述性:标记直观,易于理解和维护。
  4. 与多种技术兼容:与HTML、XSLT、XPath等技术结合使用,功能强大。
缺点:
  1. 冗余性:文件通常较大,因为需要包含大量的标记。
  2. 解析效率低:DOM解析需要加载整个文档到内存,可能对性能有影响。
  3. 学习曲线:需要掌握一定的语法和规范,尤其是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文件,主要包括以下几种方法:

  1. QDomDocument(DOM解析)

    • 将整个XML文档加载到内存中,构建一个树状结构,允许随机访问和修改文档的任意部分。
    • 适用于小型且结构简单的XML文件,尤其是需要频繁修改和操作文档结构的场景。
  2. QXmlStreamReader/QXmlStreamWriter(流式解析)

    • 基于流的方式逐个处理XML文档的元素,不需要将整个文档加载到内存中。
    • 适合处理大型XML文件,尤其是对内存消耗有限制的场景。
  3. QtXmlPatterns(XQuery和XPath支持)

    • 提供对复杂查询和数据处理的支持,适用于需要进行复杂筛选和转换的场景。
二、Qt中XML的作用
  1. 数据存储和配置管理
    • XML文件常用于存储应用程序的配置信息,Qt通过DOM或流式解析方式可以方便地读取和修改这些配置。
  2. 数据交换
    • 在跨平台或跨语言的应用中,XML作为数据交换格式,Qt可以高效地解析和生成XML文档。
  3. 文档处理
    • Qt支持对XML文档的结构化处理,包括读取、修改和生成,适用于需要对文档进行复杂操作的场景。
三、Qt中XML的优缺点
(一)QDomDocument(DOM解析)
  • 优点
    • 提供完整的文档树结构,支持随机访问和修改。
    • API丰富,操作灵活,适合复杂文档的处理。
  • 缺点
    • 需要将整个文档加载到内存中,内存占用较高,不适合处理大型文件。
(二)QXmlStreamReader/QXmlStreamWriter(流式解析)
  • 优点
    • 内存效率高,适合处理大型文件。
    • 解析速度快,逐个处理元素,适合顺序读取。
  • 缺点
    • 不支持随机访问,只能顺序遍历。
    • 不支持直接修改文档。
(三)QtXmlPatterns
  • 优点
    • 支持复杂查询和数据处理,适合需要使用XPath和XQuery的场景。
  • 缺点
    • 性能相对较低,适合对查询功能要求较高的场景。
四、为什么选择Qt的XML功能?
  1. 灵活性
    • Qt提供了多种解析方式,开发者可以根据需求选择DOM、流式解析或XPath等方法。
  2. 高效性
    • 流式解析方式(QXmlStreamReader/QXmlStreamWriter)特别适合处理大型文件,避免内存溢出。
  3. 易用性
    • Qt的XML模块提供了简洁易用的API,开发者可以快速上手。
  4. 跨平台性
    • Qt的XML功能在不同平台上保持一致,方便跨平台开发。
五、总结

Qt的XML功能适用于多种场景,开发者可以根据需求选择合适的解析方式。对于小型文件和复杂操作,DOM解析是理想选择;对于大型文件和高效处理,流式解析更为适合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33151.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# Unity 唐老狮 No.9 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体…

【2025最新】phpMyAdmin渗透利用全链路:信息收集→漏洞探测→后渗透提权技巧

目录 一、信息收集与漏洞探测 1. 获取关键信息 2. 权限验证 3. 漏洞扫描 二、历史漏洞利用方法 1. 写入 Webshell 到了这个地步密码探索 2. 远程代码执行&#xff08;RCE&#xff09; 3. 提权与后渗透 4. 文件包含漏洞 三、高危历史漏洞列表 四、防御与加固建议 五…

泰山派开发之—Ubuntu24.04下Linux开发环境搭建

简介 最近翻到了吃灰已久的泰山派&#xff0c;是刚出来的时候用优惠券买的&#xff0c;当时价格挺便宜的&#xff0c;最近给它翻出来了&#xff0c;打算试试做个项目。买的泰山派容量是2G16G&#xff0c;SOC芯片使用的是RK3566&#xff0c;搭载1TOP算力的NPU&#xff0c;并且具…

05延迟任务精准发布文章(redis实现延迟任务、分布式锁)

上架不代表发布(需要发布app端才会显示文章&#xff09; 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间 延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在…

linux 命令 ls

ls 是 Linux 系统中用于列出目录内容的核心命令&#xff0c;几乎所有日常操作都会用到。以下是其详细用法和常见场景说明 1. 基础语法 ls [选项] [目录/文件] 不指定目录时&#xff0c;默认列出当前目录的内容。 可以指定文件或目录路径&#xff0c;支持通配符&#xff08;如…

c++介绍函数指针 十

指针代表内存中地址标识符&#xff0c;变量&#xff0c;数组都是存储内存中的数据。所以可以获得它们的地址&#xff0c;用指针来表示这块内存。 如图输出内存中的地址。 对于一个函数来说&#xff0c;也是内存中存储这段数据&#xff0c;所以我们也可以获取函数的地址。 函数…

艾尔登复刻Ep1——客户端制作、场景切换、网络控制

需要添加的插件内容 Netcode for GameObjects&#xff1a;是一个为 Unity 游戏开发提供高级网络功能的 SDK。它的主要作用是允许开发者在其 GameObject 和 MonoBehaviour 工作流中集成网络功能&#xff0c;并且可以与多种底层传输层协议兼容。 具体内容请看&#xff1a;https:…

WPS的Excel文档如何利用VB脚本批量替换超链接的内容

准备知识 关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】 https://blog.csdn.net/wenhao_ir/article/details/146212767 激活WPS的Excel文档中的VB编辑器功能 没有激活前的截图如下: 原因是我们的电脑中缺乏VBA插件,我们点击“开发工具”:…

Houdini学习笔记

1. Houdini中一次只能显示一个物体 如果要都显示 需要 merge 节点 粉色的是 以参考显示 2.对任意一个节点按F1 可以弹出houdini官方文档 3. 恢复视角 Space H,居中 Space G 居中选中物体

基于SpringBoot实现旅游酒店平台功能十一

一、前言介绍&#xff1a; 1.1 项目摘要 随着社会的快速发展和人民生活水平的不断提高&#xff0c;旅游已经成为人们休闲娱乐的重要方式之一。人们越来越注重生活的品质和精神文化的追求&#xff0c;旅游需求呈现出爆发式增长。这种增长不仅体现在旅游人数的增加上&#xff0…

【一次成功】Win10本地化单机部署k8s v1.31.2版本及可视化看板

【一次成功】Win10本地化单机部署k8s v1.31.2版本及可视化看板 零、安装清单一、安装Docker Desktop软件1.1 安装前<启用或关闭Windows功能> 中的描红的三项1.2 查看软件版本1.3 配置Docker镜像 二、更新装Docker Desktop三、安装 k8s3.1 点击启动安装3.2 查看状态3.3 查…

网络安全之数据加密(DES、AES、RSA、MD5)

刚到公司时&#xff0c;我的工作就是为app端提供相应的接口。之前app使用的是PHP接口&#xff0c;对数据加密方面做得比较少。到使用java接口时&#xff0c;老大开始让我们使用DES加密&#xff0c;进行数据传输&#xff0c;但是后来觉得DES是对称加密&#xff0c;密钥存在客户端…

深度学习知识:softlabel策略

目录 一、hard label和soft label之间的关系 二、如何得到soft label 1. 回归任务&#xff1a;使用离散化方法生成软标签 PS: Soft 标签的定义规则 2. ​分类任务&#xff1a;使用 Label Smoothing 或 Knowledge Distillation 方法1&#xff1a;Label Smoothing PS: 用 …

自然语言处理:文本聚类

介绍 大家好&#xff0c;博主又来和大家分享自然语言处理领域的知识了。今天给大家分享的内容是自然语言处理中的文本聚类。 文本聚类在自然语言处理领域占据着重要地位&#xff0c;它能将大量无序的文本按照内容的相似性自动划分成不同的类别&#xff0c;极大地提高了文本处…

Python----计算机视觉处理(opencv:像素,RGB颜色,图像的存储,opencv安装,代码展示)

一、计算机眼中的图像 像素 像素是图像的基本单元&#xff0c;每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成 了完整的图像&#xff0c;在计算机中&#xff0c;图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不 同&#xff0c;每个像…

Spring Boot(十六):使用 Jenkins 部署 Spring Boot

Jenkins 是 Devops 神器&#xff0c;本篇文章介绍如何安装和使用 Jenkins 部署 Spring Boot 项目 Jenkins 搭建、部署分为四个步骤&#xff1b; 第一步&#xff0c;Jenkins 安装 第二步&#xff0c;插件安装和配置 第三步&#xff0c;Push SSH 第四步&#xff0c;部署项目 第…

【Linux 指北】常用 Linux 指令汇总

第一章、常用基本指令 # 注意&#xff1a; # #表示管理员 # $表示普通用户 [rootlocalhost Practice]# 说明此处表示管理员01. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xf…

解决Windows版Redis无法远程连接的问题

&#x1f31f; 解决Windows版Redis无法远程连接的问题 在Windows系统下使用Redis时&#xff0c;很多用户会遇到无法远程连接的问题。尤其是在配置了Redis并尝试通过工具如RedisDesktopManager连接时&#xff0c;可能会报错“Cannot connect to ‘redisconnection’”。今天&am…

大语言模型学习及复习笔记(1)语言模型的发展历程

1.大模型进入人们视野 ChatGPT 于2022年11月底上线 模型名称 发布时间 核心突破 GPT-3 2020年6月 首款千亿参数模型&#xff0c;少样本学习 GPT-3.5-Turbo 2022年11月 对话能力优化&#xff0c;用户级应用落地 GPT-4 2023年3月 多模态、强逻辑推理 GPT-4o / GPT-4…

MySQL中count(*)与count(字段区别)

核心规则 表达式 统计规则 COUNT(*) 统计所有行数&#xff08;包括所有字段为NULL的行&#xff09;。 COUNT(字段) 仅统计该字段不为NULL的行数&#xff08;若字段为NULL则自动忽略该行&#xff09;。 误区 A表连接B表&#xff0c;若A和B是一对多的关系时&#xff0c;会出现…