XML外部实体注入--XML基础

一.XML基础

1.XML 基础概念

  1. 定义:XML 即可扩展标记语言(Extensible Markup Language),用于标记电子文件,使其具有结构性。它是一种允许用户对自己的标记语言进行定义的源语言,可用来标记数据、定义数据类型。

  2. 设计宗旨与应用:XML 的设计宗旨是传输数据,而非显示数据。在 web 中应用广泛,是各种应用程序之间数据传输最常用的格式。

  3. 与 HTML 的区别

    • HTML 用于定义数据的展示,专注于数据呈现的样子;XML 用于传输和存储数据。
    • 两者都用标签组织文本内容,但 HTML 有预定义的标签,而 XML 没有预定义标签,需自行定义。
  4. 特点

    • 设计宗旨为传输数据。
    • 标签需自行定义。
    • 具有自我描述性。
    • 是 W3C 的推荐标准。
  5. 文档结构

    • XML 声明(可选) :定义 XML 的版本和所使用的编码,如 <?xml version="1.0" encoding="UTF-8"?> ,它不属于 XML 本身的组成部分,无关闭标签。

    • DTD 文档类型定义(可选) :此部分原文未详细阐述,它主要用于定义 XML 文档的合法构建模块,可约束 XML 文档的结构和元素类型等。

    • 文档元素:包括根元素及子元素等。例如以下 XML 文档实例:

      <?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
      <fruits><fruit>这是一个香蕉</fruit><fruit color="红色">这是一个苹果。</fruit>
      </fruits>
      
      • 说明

        • 第一行是 XML 声明,定义版本为 1.0,编码为 UTF - 8 。
        • <!--XML 声明--> 为 XML 注释。
        • 第二行 <fruits> 是文档的根元素,它是所有其他元素的父元素。
        • 后续 <fruit> 等为子元素及元素结尾。
        • 整个 XML 呈现树形结构,有根节点(如 <fruits> )和子节点(如 <fruit> 等)。
  • 元素:XML 元素指从开始标签直到结束标签的部分(包括标签)。一个元素可以包含:

    • 其他元素(子元素),如 <fruits> 包含 <fruit>
    • 文本,如 <fruit>这是一个香蕉</fruit> 中的 “这是一个香蕉” 。
    • 属性,如 <fruit color="红色">这是一个苹果。</fruit> 中的 color="红色"

2.XML 语法规则

  1. XML 声明位置:XML 声明文件是可选部分,若存在需放在文档第一行。

  2. 根元素要求:XML 必须包含根元素,它是所有其他元素的父元素,如上述例子中的 <girls>

  3. 标签规则

    • 关闭标签要求:所有 XML 元素都必须有关闭标签,省略关闭标签是非法的,例如 <p>This is a paragraph</p> 。但需注意,XML 声明没有关闭标签,因为它不属于 XML 元素。
    • 大小写敏感:XML 标签对大小写敏感,标签 <Letter> 与标签 <letter> 不同,打开标签和关闭标签必须使用相同的大小写,如 <message>这是正确的。</message>
    • 正确嵌套:在 XML 中,所有元素都必须彼此正确地嵌套,如 <b><i>This text is bold and italic</i></b><i> 元素在 <b> 元素内打开,就在 <b> 元素内关闭。
    • 属性值引号:与 HTML 类似,XML 可拥有属性(名称 / 值的对),且 XML 的属性值须加引号。例如 <note date="08/08/2008"> 是正确的,而 <note date=08/08/2008> 是错误的。

3.XML 数据类型

  1. PCDATA:被解析的字符数据,其中的标签会被当作标记来处理,实体会被展开。例如在一般的 XML 文本内容中,大多属于 PCDATA 类型,标签会按 XML 语法规则解析。

  2. CDATA:不被解析的字符数据,其中的标签不会被当作标记来对待,实体也不会被展开。常用于需要包含大量特殊字符或不想让 XML 解析器处理的文本,例如在 XML 中嵌入一段 JavaScript 代码时,可使用 CDATA 部分来包裹代码,确保代码中的尖括号等特殊字符不被误解析。如:

    <![CDATA[
    function example() {console.log('This is a CDATA section');
    }
    ]]>
    

二.DTD

1.DTD 概述

  1. 定义

    • DTD(Document Type Definition)即文档类型定义,是用来控制文档格式规范的,由 XML 设计者或作者开发。
    • 它定义了 XML 中存在哪些标签、元素拥有哪些属性以及元素的内部结构等。
  2. DTD 实例说明

    <!ELEMENT bookstore (book)*> 
    <!-- 定义了根元素 bookstore,它可以包含零个或多个 book 元素 --><!ELEMENT book (title, author, price)> 
    <!-- 定义了 book 元素,它包含三个子元素:title、author 和 price,且必须按此顺序出现 --><!ELEMENT title (#PCDATA)> 
    <!-- 定义 title 元素,其内容为可解析的字符数据(PCDATA) --><!ELEMENT author (#PCDATA)> 
    <!-- 定义 author 元素,其内容为可解析的字符数据(PCDATA) --><!ELEMENT price (#PCDATA)> 
    <!-- 定义 price 元素,其内容为可解析的字符数据(PCDATA) --><!ATTLIST book category CDATA "fiction"> 
    <!-- 为 book 元素定义一个名为 category 的属性,其数据类型为字符数据(CDATA),默认值为 "fiction" -->
    

2.DTD 的声明方式

  1. 内部声明 DTD

    • 内部声明必须使用 <!DOCTYPE> 元素,将 DTD 嵌入在 XML 文档内部。例如:
    <?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
    <!DOCTYPE bookstore [<!ELEMENT book (title, author, price)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)><!ELEMENT price (#PCDATA)> <!ATTLIST book category CDATA "fiction"> 
    ]>
    <bookstore><book category="science"><title>XML 基础教程</title><author>张三</author><price>30.00</price></book><book><title>Java 编程指南</title><author>李四</author><price>50.00</price></book>
    </bookstore>
    
    • 解释:在这个示例中,<!DOCTYPE bookstore [... ]> 部分将 DTD 定义包含在方括号内,使其成为 XML 文档的一部分,用于约束 bookstore 元素及其子元素的结构和属性。
  2. 外部引用 DTD

    • 介绍:可以从外部的 .dtd 文件中引用,这是一种常用的方式,但也可能是 XXE 漏洞产生的原因。

    • 引用格式<!DOCTYPE 根元素 SYSTEM "URL">

      <?xml version="1.0" encoding="UTF-8"?> <!--XML 声明-->
      <!DOCTYPE bookstore SYSTEM "bookstore.dtd">
      <bookstore><book category="science"><title>XML 基础教程</title><author>张三</author><price>30.00</price></book><book><title>Java 编程指南</title><author>李四</author><price>50.00</price></book>
      </bookstore>
      
      • 解释:这里使用 <!DOCTYPE bookstore SYSTEM "bookstore.dtd"> 声明,将从指定的 bookstore.dtd 文件中获取 DTD 信息。常见的 URL 协议有多种,可根据实际情况选择不同的协议进行外部引用

        • libxml2PHPJava.Net
          filefilehttpfile
          httphttphttpshttp
          ftpftpftphttps
          phpfileftp
          compress.zlibjar
          compress.bzip2netdoc
          datamailto
          globgopher
          phar

3.DTD 实体

  • 实体的概念

    • 实体(ENTITY):如果在 XML 文档中需要频繁使用某一条数据,可以预先给这个数据起一个别名(类似于变量),作为一个 ENTITY,然后在文档中调用它。
    • 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
    • 实体可以分为通用实体和参数实体,都可以内部声明或者外部引用。
  • 通用实体

    • 介绍:通用实体是在 DTD 中定义的一种实体类型,它允许你为一段文本内容创建一个别名,以便在 XML 文档中多次使用。

    • 语法<!ENTITY name "value">

    • 引用:在 XML 中引用通用实体时,由 &(和号)、实体名称(xxe)、;(分号)三部分组成。

    • 通用实体在 DTD 中定义,在 XML 文档中都可以使用。例如:

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE note [<!-- 定义通用实体 --><!ENTITY companyName "ABC"><!-- 定义元素 note 包含一个元素 content --><!ELEMENT note (content)><!-- 定义元素 content 包含可解析的字符数据 --><!ELEMENT content (#PCDATA)>
      ]>
      <note><content>This note is &companyName;</content>
      </note>
      
    • 解释

      1. DTD 部分

        • <!DOCTYPE note [... ]>:使用 <!DOCTYPE> 开始内部声明 DTD,其中 note 是根元素。
        • <!ENTITY companyName "ABC">:定义了一个名为 companyName 的通用实体,其值为 "ABC"。这个实体可以在后续的 XML 元素中使用。
        • <!ELEMENT note (content)>:定义 note 元素,它包含一个 content 子元素。
        • <!ELEMENT content (#PCDATA)>:定义 content 元素,其内容为可解析的字符数据,即可以包含文本内容。
      2. XML 部分

        • <note> 是根元素,包含一个 <content> 子元素。
        • <content> 元素中的 &companyName; 是对之前定义的通用实体的引用。当 XML 解析器解析这个文档时,会将 &companyName; 替换为 "ABC",最终解析的内容如下:
  • 参数实体

    • 介绍:参数实体是一种只能在 DTD 中使用的实体,它的主要目的是在 DTD 中创建可重用的部分,使 DTD 的结构更加简洁和易于维护。

    • 语法<!ENTITY % name "value">

    • 引用:在 XML 中引用参数实体时,由 %(百分号)、实体名称(xxe)、;(分号)三部分组成。

    • 示例代码

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE message [<!-- 定义参数实体 --><!ENTITY % commonElements "sender, receiver, body"><!-- 定义元素 message 包含参数实体所代表的元素序列 --><!ELEMENT message (%commonElements;)><!-- 定义元素 sender 包含可解析的字符数据 --><!ELEMENT sender (#PCDATA)><!-- 定义元素 receiver 包含可解析的字符数据 --><!ELEMENT receiver (#PCDATA)><!-- 定义元素 body 包含可解析的字符数据 --><!ELEMENT body (#PCDATA)>
      ]>
      <message><sender>Alice</sender><receiver>Bob</receiver><body>Hello, Bob! How are you today?</body>
      </message>
      
      • 解释:

        1. DTD 部分

          • <!DOCTYPE message [... ]>:使用 <!DOCTYPE> 开始内部声明 DTD,其中 message 是根元素。
          • <!ENTITY % commonElements "sender, receiver, body">:定义了一个参数实体 %commonElements;,它代表 "sender, receiver, body"
          • <!ELEMENT message (%commonElements;)> :在定义 message 元素时,使用了参数实体 %commonElements; 来表示 message 元素包含 senderreceiverbody 元素。
          • <!ELEMENT sender (#PCDATA)><!ELEMENT body (#PCDATA)>:分别定义了 senderreceiverbody 元素包含可解析的字符数据,即可以包含文本内容。
        2. XML 部分

          • <message> 是根元素,它包含了 senderreceiverbody 元素,这些元素的结构是根据 DTD 中使用参数实体所定义的。
  • 预定义实体

    • 第一种引用方法

在这里插入图片描述

第二种引用方法

  • 实体特殊符号描述
    &lt;<小于
    &gt;
    >大于
    &amp;
    &和号
    &apos;单引号
    &quot;"双引号

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

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

相关文章

YOLOv8改进,YOLOv8检测头融合DSConv(动态蛇形卷积),并添加小目标检测层(四头检测),适合目标检测、分割等

精确分割拓扑管状结构例如血管和道路,对各个领域至关重要,可确保下游任务的准确性和效率。然而,许多因素使任务变得复杂,包括细小脆弱的局部结构和复杂多变的全局形态。在这项工作中,注意到管状结构的特殊特征,并利用这一知识来引导 DSCNet 在三个阶段同时增强感知:特征…

Flutter:自定义Tab切换,订单列表页tab,tab吸顶

1、自定义tab切换 view <Widget>[// 好评<Widget>[TDImage(assetUrl: assets/img/order4.png,width: 36.w,height: 36.w,),SizedBox(width: 10.w,),TextWidget.body(好评,size: 24.sp,color: controller.tabIndex 0 ? AppTheme.colorfff : AppTheme.color999,),]…

深度学习笔记——循环神经网络RNN

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型&#xff08;Bag of Words, BOW&#xff09;工作原…

nvm版本安装

安装 使用切换 MySQL5.7新安装 熟人命令 8.0 mysql -P3306 -uroot -p5.7 mysql -P3307 -uroot -p 记得用完关闭

人工智能之深度学习_[4]-神经网络入门

文章目录 神经网络基础1 神经网络1.1 神经网络概念1.1.1 什么是神经网络1.1.2 如何构建神经网络1.1.3 神经网络内部状态值和激活值 1.2 激活函数1.2.1 网络非线性因素理解1.2.2 常见激活函数1.2.2.1 Sigmoid 激活函数1.2.2.2 Tanh 激活函数1.2.2.3 ReLU 激活函数1.2.2.4 SoftMa…

一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk

文章目录 一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. 啥是chunkIds3.怎么使用chunkIds4. 啥是runtimeChunk5. 怎么使用runtimeChunk 一文大白话讲清楚webpack基本使用——11——chun…

第11篇:vue3 中 props 的使用

第一步&#xff1a;App.vue 中发送数据&#xff1a; <template> <Person :list"persons"/> //注意多个的话 中间是没有 , // <Person a "哈哈中" :list persons /> </template> let persons reactive([ {id:e98219e12,n…

【Tool】沉浸式翻译 DeepLX

效果对比 对比一下四个常用的翻译工具的效果 不难看出只有Deepl算是在讲人话 如何配置 DeepLX 安装沉浸式翻译插件 获取APIKEY 从这获取: https://linux.do/t/topic/111737 配置 参考官方教程: https://linux.do/t/topic/111911

SSM开发(二) MyBatis简介

目录 一、MyBatis是什么 二、mybatis的优点 三、mybatis的缺点 四、mybatis与JDBC、jdbctemplate对比 1、JDBC 2、 MyBatis 3、 JdbcTemplate 五、mybatis工作原理 一、MyBatis是什么 mybatis是一个简化和实现了java数据持久层的开源框架&#xff0c;它抽象了大量的JDB…

LabVIEW 水电站厂内经济运行系统

基于 LabVIEW 的水电站经济运行系统&#xff0c;主要针对农村小水电站运行管理的不足进行改进&#xff0c;通过精确控制发电与用水量&#xff0c;最小化耗水量并优化负荷分配&#xff0c;提升水电站的运营效率和经济效益。 ​ LabVIEW 在系统中的功能特点 强大的图形化编程环…

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备 2.1 依赖配置 3. WebClient配置 3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例 4.1 基本请求操…

鸿蒙仓颉环境配置(仓颉SDK下载,仓颉VsCode开发环境配置,仓颉DevEco开发环境配置)

目录 ​1&#xff09;仓颉的SDK下载 1--进入仓颉的官网 2--点击图片中的下载按钮 3--在新跳转的页面点击即刻下载 4--下载 5--找到你们自己下载好的地方 6--解压软件 2&#xff09;仓颉编程环境配置 1--找到自己的根目录 2--进入命令行窗口 3--输入 envsetup.bat 4--验证是否安…

【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制

目录 一、背景 二、核心特性 2.1 AI驱动的代码自动生成 2.2 智能问答与代码补全 2.3 多语言支持 2.4 插件与扩展 三、架构 四、下载使用 4.1 下载与安装 4.2 界面与配置 五、应用实践 5.1 快速生成代码 5.2 智能问答与调试 5.3 团队协作与代码审查 六、与Cursor…

linux网络 | 传输层TCP | 认识tcp报头字段与分离

前言&#xff1a; 本节内容继续传输层的讲解&#xff0c; 本节讲解的是tcp协议。 tcp协议是我们日常中最常用的协议。就比如我们浏览网页&#xff0c;我们知道网页时http或者https协议。 其实http或者https底层就是用的tcp协议。tcp协议&#xff0c;全名又称为传输控制协议&…

快速入门Flink

Flink是新一代实时计算平台&#xff0c;采用原生的流处理系统&#xff0c;保证了低延迟性&#xff0c;在API和容错上也是做的相当完善&#xff0c;本文将从架构、组件栈、安装、入门程序等进行基础知识的分析&#xff0c;帮助大家快速对Flink有一个了解。 一.简介 1.是什么 Ap…

最新版pycharm如何配置conda环境

首先在conda prompt里创建虚拟环境&#xff0c;比如 conda create --prefix E:/projects/myenv python3.8然后激活 conda activate E:/projects/myenv往里面安装点自己的包&#xff0c;比如 conda install pytorch1.7.1 torchvision0.8.2 -c pytorch打开pycharm 注意&#x…

循环队列(C语言版)

循环队列(C语言版&#xff09; 1.简单介绍循环队列2.使用何种结构来实现3.基本结构4.初始化5.判空判满6.向循环队列插入一个元素7.从循环队列中删除一个元素8.获取队头队尾元素9.释放空间10.完整代码 &#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#…

【线性代数】列主元法求矩阵的逆

列主元方法是一种用于求解矩阵逆的数值方法&#xff0c;特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵&#xff0c;然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤&#xff1a; [精确算法] 列主元高斯消元法 步骤 1&am…

OGG 19C 集成模式启用DDL复制

接Oracle19C PDB 环境下 OGG 搭建&#xff08;PDB to PDB&#xff09;_cdb架构 配置ogg-CSDN博客&#xff0c;给 pdb 环境 ogg 配置 DDL 功能。 一个报错 SYShfdb1> ddl_setup.sqlOracle GoldenGate DDL Replication setup scriptVerifying that current user has privile…

基于微信小程序的健身管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…