XML语法

ops/2025/3/15 6:08:31/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

一、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"><?xml version="1.0" encoding="UTF-8"?>
    
    • version="1.0"表示XML版本为1.0。
    • encoding="UTF-8"表示文件的字符编码是UTF-8。
  2. 根元素:XML文件必须有一个根元素,根元素是整个文档的最外层元素。例如:
    xml"><library><!-- 图书馆的内容 -->
    </library>
    
    在这个例子中,<library>就是根元素。
  3. 子元素和属性:根元素可以包含子元素,子元素也可以包含子元素,从而形成一个层次结构。元素还可以有属性,用于描述元素的额外信息。例如:
    xml"><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. 空元素:如果一个元素没有内容,可以使用空元素的形式。例如:
    xml"><book id="3"/>
    
    等同于:
    xml"><book id="3"></book>
    
  3. 嵌套规则:元素可以嵌套,但不能交叉嵌套。例如,以下代码是错误的:
    xml"><book><title><author>John Doe</author></title>
    </book>
    
    因为<author>元素被错误地嵌套在<title>元素中,而<title><author>应该是同级元素。
(三)属性规则
  1. 属性定义:属性用于为元素提供额外的信息,属性名和属性值之间用等号连接,属性值必须用引号(单引号或双引号)括起来。例如:
    xml"><book id="1" category="编程"><title>XML教程</title><author>Kimi</author>
    </book>
    
    • id="1"category="编程"<book>元素的属性。
  2. 属性值的引号:属性值可以用双引号或单引号括起来,但不能混用。例如:
    xml"><book id='1' category="编程"/>
    
    如果属性值中包含引号,可以使用转义字符。例如:
    xml"><book id="1" description="This book is 'great'"/>
    
(四)注释

XML文件中可以添加注释,注释的内容不会被解析器处理。注释的语法是:

xml"><!-- 这是注释内容 -->

例如:

xml"><library><!-- 图书馆的书籍列表 --><book id="1"><title>XML教程</title><!-- 作者信息 --><author>Kimi</author></book>
</library>
(五)特殊字符

在XML文件中,有些字符有特殊的含义,如果需要在内容中使用这些字符,需要使用实体引用。常见的特殊字符及其实体引用如下:

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

例如:

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

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

  1. 内部DTD:嵌入在XML文件中。例如:

    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"><?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(统一资源标识符)。例如:

xml"><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. 默认命名空间

如果没有指定前缀,可以定义一个默认命名空间。例如:

xml"><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"><?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"><?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协议的数据传输。例如:

xml"><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:

xml"><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.ppmy.cn/ops/165869.html

相关文章

Linux红帽:RHCSA认证知识讲解(六)创建、管理和删除本地用戶和组

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;六&#xff09;创建、管理和删除本地用戶和组 前言一、用户和组概念用户类型对比表格主要组和补充组对比表格&#xff1a; 二、本地用户账户增删改查三、本地组账户 前言 上篇博客我们详细了解了从红帽和 DNF 软件仓库下载…

【Golang】第三弹----运算符

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 一、运算符介绍 运算符是一…

【sql靶场】第11、12关-post提交注入

目录 【sql靶场】第11、12关-post提交注入 POST 一、URL 二、核心组成部分 三、数据编码规范 四、应用场景与请求方法 第十一关 方法一 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 步骤七 方法二 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 步骤七 第…

JVM和运行时数据区

目录 运行时数据区 元空间 Java 虚拟机栈 java 堆 程序计数器 本地方法栈 JVM JVM是Java Virtual Machine的简称&#xff0c;是java程序的运行环境&#xff08;二进制字节码的运行环境&#xff09;。主要由三个子系统构成&#xff0c;分别是类加载子系统、运行时数据区和…

QT创建项目(项目模板、构建系统、选择类、构建套件)

1. 项目模版 项目类型界面技术适用场景核心依赖模块开发语言Qt Widget ApplicationC Widgets传统桌面应用&#xff08;复杂控件&#xff09;Qt WidgetsCQt Console Application无 GUI命令行工具、服务Qt CoreCQt Quick ApplicationQML/Quick现代跨平台应用&#xff08;动画/触…

K8S学习之基础二十八:k8s中的configMap

k8s中的configMap ​ configMap是k8s的资源对象&#xff0c;简称cm&#xff0c;用于保存非机密性的配置&#xff0c;数据可以用key/value键值对形式保存&#xff0c;也可以通过文件形式保存 ​ 在部署服务的时候&#xff0c;每个服务都有自己的配置文件&#xff0c;如果一台服…

python多线程和多进程——使用 concurrent.futures.ProcessPoolExecutor 和 ThreadPoolExecutor

在使用 concurrent.futures.ProcessPoolExecutor 和 ThreadPoolExecutor 时&#xff0c;如果你不指定 max_workers 参数&#xff0c;Python 会根据系统资源和任务类型自动选择一个合理的默认值。以下是关于这两个执行器的默认行为的详细说明&#xff1a; ProcessPoolExecutor …

深度学习篇---Opencv中的Haar级联分类器

文章目录 1.Haar 级联分类器配置文件的结构2.OpenCV 自带的 Haar 级联分类器配置文件2.1人脸检测2.1.1haarcascade_frontalface_default.xml2.1.2haarcascade_frontalface_alt.xml2.1.3haarcascade_frontalface_alt2.xml2.1.4haarcascade_frontalface_alt_tree.xml 2.2眼睛检测…