首页 > 其他分享 >XML学习

XML学习

时间:2023-04-23 19:44:46浏览次数:38  
标签:XML 元素 DTD 学习 实例 文档 声明

XML学习

  1. 什么是XML?
  • XML指可扩展标记语言(Extensible Markup Language)。
  • XML是一种很像HTML的标记语言。
  • XML的设计宗旨是传输数据,而不是显示数据。
  • XML标签没有被预定义。您需要自行定义标签。
  • XML被设计为具有自我描述性。
  • XML是W3C的推荐标准。
  1. XML和HTML之间的差异
    XML不是HTML的替换。XML和HTML为不同的目的而设计,HTML宗旨在于显示信息,而XML是在传输信息。
  • XML被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML被设计用来显示数据,其焦点是数据的外观。
  1. XML声明
    <?xml version="1.0" encoding="UTF-8"?>

  2. 文档实例

<?xml version="1.0" encoding="UTF-8">
<site>
    <name>BAIDU</name>
    <url>https://www.baidu.com</url>
    <desc>百度一下</desc>
</site>
<bookstore>
    <book category="COOKING">
        <title lang="en">Everyday Italian</title>
        <author>Giada De Laurentiis</author>
        <year>2005</year>
        <price>30.00</proce>
    </book>
    <book category="CHILDREN">
        <title lang="en">Harry Potter</title>
        <author>Makding</author>
        <year>2005</year>
        <price>29.8</price>
    <book>
<bookstore>

注意:

  • XML必须包含根元素,它是所有其他元素的父元素
  • XML声明文件的可选部分,如果存在需要放在文档的第一行。
  • 所有的XML元素都必须有一个关闭标签
  • XML标签的大小写敏感
  • XML必须使用正确的嵌套
  • XML属性值必须加引号
  • 在XML中,一些字符拥有特殊意义,为了避免错误,请使用实体引用来替换
  • 在XML中,空格会被保留

在XML中,有5个预定义的实体引用:

引用 实体 意思
&lt; < less than
&gt; > greater than
&amp; & ampersand
&apos; ' apostrophe
&quot; " quotation mark

在XML中编写注释的语法与HTML的语法很相似。
<!--This is a comment -->

XML命名规则:

  • 名称可以包含字母、数字以及其他字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字母xml(或者XML、Xml等等)开始
  • 名称不能包含空格

避免使用XML属性

  • 属性不能包含多个值(元素可以)
  • 属性不能包含数结构(元素可以)
  • 属性不容易扩展(为未来的变化)

DTD(文档类型定义)的作用是定义XML文档的合法构建模块。DTD可被成行地声明于XML文档中,也可以作为一个外部引用。

  1. 内部的DOCTYPR声明
    假如DTD被包含在你的XML源文件中,它应当通过下面的语法包装在一个DOCTYPE声明中:
<!DOCTYPE root-element [element-declarations]>

带有DTD的XML文档实例

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

浏览器打开查看:
img

以上DTD解释如下:

  • !DOCTYPE note(第二行)定义此文档是note类型的文档。
  • !ELEMENT note(第三行)定义note元素有四个元素:“to、from、heading、body”
  • !ELEMENT to(第四行)定义to元素为“#PCDATA"类型
  • !ELEMENT to(第四行)定义from元素为“#PCDATA"类型
  • !ELEMENT to(第四行)定义heading元素为“#PCDATA"类型
  • !ELEMENT to(第四行)定义body元素为“#PCDATA"类型
  1. 外部文档声明
    假如DTD位于XML源文件的外部,那么它应该通过下面的语法被封装在一个DOCTYPE定义中:
<!DOCTYPE root-element SYSTEM "filename">

这个XML文档和上面的XML文档相同,但是拥有一个外部的DTD:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note> 

包含DTD的"note.dtd"文件

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
  1. 为什么使用DTD?
    通过DTD,你的每一个XML文件均可携带一个有关于自身格式的描述。通过DTD,独立的团体可一致地使用某个标准的DTD来交换数据。你的应用程序也可使用某个标准DTD来验证从外部接收到的数据。还可以使用DTD来验证你自身的数据。

XML构建模块
XML和HTML文档的主要的构建模块是元素的标签。
所有的XML文档(以及HTML文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA
    PCDATA的意思是被解析的字符数据(parsed character data),可把字符数据想象为XML元素的开始标签与结束标签之间的文本。PCDATA是会被解析器解析的文本,这些文本将被解析器检查实体以及标记。
    CDATA的意思的是字符数据(character data),CDATA是不会被解析器解析文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

DTD元素

在一个DTD中,元素通过元素声明来进行声明。
在DTD中,XML元素通过元素声明来进行声明。元素声明使用以下语法:

<!ELEMENT element-name category>
或
<!ELEMENT element-name (element-content)>

空元素可以通过类别关键词EMPTY进行声明:

<!ELEMENT element-name EMPTY>
实例
<!ELEMENT br EMPTY>
XML example:
<br />

只有PCDATA的元素:

<!ELEMENT element-name (#PCDATA)>
实例:
<!ELEMENT from (#PCDATA)>

带有任何内容的元素
通过类别词ANY声明的元素,可包含任何可解析的数据的组合:

<!ELEMENT element-name ANY>
实例:
<!ELEMENT note ANY>

带有子元素(序列)的元素
带有一个或者多个子元素通过圆括号中的子元素名进行声明:

<!ELEMENT element-name (child1)>
或者
<!ELEMENT elemant-name (child1,child3,...)>
实例
<!ElEMENT note (to,from,heading,body)>

当子元素按照有逗号分隔的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中,在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note"元素的完整声明是:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

声明只出现一次的元素

<!ELEMENT element-name (child-name)>
实例
<!ELEMENT note (message)>

声明最少出现一次的元素

<!ELEMENT element-name (child-name+)>
实例
<!ELEMENT note (message+)>

声明出现零次或者多次的元素

<!ELEMENT element-name (child-name*)>
实例
<!ELEMENT note (message*)>

声明"非../即..."类型的内容

<!ELEMENT note ( to,from,header,(message|body))>

声明混合型的内容

<!ELEMENT note (#PCDATA|to|from|header|message)*>

DTD属性

声明属性

<!ATTLIST element-name attribute-name attribute-type attribute-value>
DTD实例:
<!ATTLIST payment type CDATA "check">
XML实例:
<payment type="check"/>

属性类型选项:

类型 描述
CDATA 值为字符数据 (character data)
(en1 en2
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值

XML DOM(XML Document Object Model)定义了访问和操作XML文档的标准方法。XML DOM把XML文档作为树结构来查看,所有元素可以通过DOM树来访问,可以修改或者删除它们的内容,并创建新的元素。

XML HttpRequest对象用于在后台与服务器交换数据。

XML 命名空间通过避免元素命名冲突的方法

  1. 使用前缀来避免命名冲突
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table> 

在上面的实例中,不会有冲突,因为两个

元素有不同的名称。
XML命名空间-xmlns属性
当在XML中使用前缀时,一个所谓的前缀的命名空间必须被定义。命名空间时在元素开始标签的xmlns属性中定义的,命名空间上面的语法如下。xmlns:前缀="URI".

<root>

<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

</root> 

在上面

标签的xmlns属性定义了h:和f:前缀的合格命名空间。当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。命名空间,可以在他们被使用的元素中或者在XML根元素中声明:

<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3cschool.cc/furniture">

<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>

<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>

</root> 

注意:命名空间URL不会被解析器用于查找信息。其目的是赋予命名空间一个唯一的名称。不过,很多公司常常会作为指针来使命名空间指向实际的网页,这个网页包含关于命名空间的信息。

XSLT是一种用于把XML文档转换为其他格式的XML语言。

XML文档中的所有文本均会被解析器解析,只有CDATA区段中的文本会被解析器忽略。
PCDATA-被解析的字符数据,当某个XML元素被解析时,其标签之间的文本也会被解析,之所以会只有做,是因为XML元素可能包含其他元素,例如下面实例:
<name><first>Bill</first><last>Gates</last></name>
CDATA是不应该由XML解析器解析的文本数据:CDATA部分由:<![CDATA["开始,由"]]>结束;

标签:XML,元素,DTD,学习,实例,文档,声明
From: https://www.cnblogs.com/kalixcn/p/17347526.html

相关文章

  • 个人对于二分图匹配的学习记录
    二分图匈牙利算法下面展示的是dfs实现的写法。//洛谷P3386二分图最大匹配匈牙利算法#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1505;constintM=50005;inthead[N],eid;structEdge{ intv,w,next;}e[M<<1];v......
  • nginx学习笔记
    开始简介Nginx是一款高性能的开源Web服务器和反向代理服务器,它能够提供可扩展性、高可用性和高性能。优点更快单次请求更快,高峰期也更快高扩展性极具扩展性,它由多个不同功能、不同层次、不同类型且耦合度极高的模块组成,这种低耦合的设计,造就了它庞大的第三方模块高可......
  • 深度学习样本绘制注意事项
    在绘制深度学习样本的时候,部分初学者总是用绘制监督分类样本的方法绘制深度学习样本,在图像上随意绘制样本,这种绘制样本的方法不适用于深度学习样本绘制。如下为错误的示例:深度学习样本绘制应遵循“全、多、精”三个原则:样本子区域选取,应该全面覆盖多种地物类型。绘制样本尽......
  • 「学习笔记」2-SAT问题
    SAT是适定性\(\text{(Satisfiability)}\)问题的简称。一般形式为k-适定性问题,简称k-SAT。而当\(k>2\)时该问题为NP完全的。所以我们只研究\(k=2\)的情况。2-SAT,简单的说就是给出\(n\)个集合,每个集合有两个元素,已知若干个\(<a,b>\),表示\(a\)与\(b\)矛盾(其中......
  • RxDart框架学习
    一、RxDart是什么?RxDart是一个响应式编程框架,是基于ReactiveX的响应式函数编程库,ReactiveX是一个强大的库,通过使用可观察的序列来编写异步的程序。它突破了语言以及平台的限制,使我们在写异步程序的时候更简洁。ReactiveX开发过多个语言下的响应式框架,比较有名的就是RxJava、R......
  • Markdowm学习
    #Markdowm学习标题##二级标题###三级标题#字体**Hello,world!***Hello,world****Hello,worid!***~~Hello,world!~~#引用>##分割线---##图片![截图](E:\新建文件夹(2)\屏幕截图2022-11-12165730.png)![图片]()##超链接[点击跳转](http://m.jrj.com.cn/......
  • mybatis-plus没有将XML配置文件放到classpath路径下的解决办法
    1.需求:我将mapper接口对应的xml文件没有放到resources路径下,而是放到了如下图中,导致无法识别1.1默认可以放mapper对应配置文件的位置1.2本人实际放置的mapper对应的xml文件位置2.解决:2.1第一步:在pom文件中添加如下配置<build><resources><reso......
  • Vue的学习笔记(下篇)
    一、什么是Vue.js?Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页......
  • Vue的学习笔记(中篇)
    一、什么是Vue.js?Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页......
  • 「学习笔记」重修 FHQ-treap
    无旋treap的操作方式使得它天生支持维护序列、可持久化等特性。无旋treap又称分裂合并treap。它仅有两种核心操作,即为分裂与合并。通过这两种操作,在很多情况下可以比旋转treap更方便的实现别的操作。变量与宏定义#definelsch[u][0]#definersch[u][1]intcnt,r......