xml(一)
引入
我们登陆网站或者是app上有天气信息,是向同一地方获取数据,但这个数据以什么格式,什么类型传来是不确定的,网站编写语言有python,java.....,这些数据得兼容所有平台发布才行,因而会有统一的格式,即xml
和html长得很像
xml数据格式功能:
数据传输(由一个服务器给到另一个服务器)
配置文件config.xml
存储数据,充当小型数据库
作用
规范了数据格式,使数据具有结构性,易读易处理
什么是xml
定义
xml指的是可扩展性标记语言
xml被发明的目的是传输和存储数据,而不是展示数据(html展示数据)
xml的标签必须自定义,但在写标签名时要有含义
xml是w3c推举的数据传输格式
如何自己写一段xml(作为服务器,提供数据)
XML 中的每个元素都是成对出现的,有开始和结束,自闭和标签除外,但是都得有 '/'结束标志
如:
- <student>xxxxx</student> 自闭和:<student name='xxx' />
- 文件后缀名.xml
- 每个XML文档都有且只有一个根元素(Root Element)
- 所有的xml 必须要有一个根节点:
<root>
<user>lucy</user>
<address>山东</address>
</root>
网站呈现

xml和html的区别
- html标签不能自定义,xml只能自定义
- html语法要求不严格,xml语法要求极其严格,标签必须是成对标签
- xml用来传输和存储数据,html用来展示数据
xml的基本语法
语法规则
1.xml必须有根节点
根节点就是其他所有结点的父级节点
<root>
<user>lucy</user>
<address>山东</address>
</root>
此文档的根节点为root
2.xml头声明不强制要求,可有可无
<?xml version="1.0" encoding="UTF-8" ?>
- version:xml的版本,必须设定,当前只有'1.0'版本
- encoding:当前xml里面的数据格式,默认UTF-8
- standalone:标记是否是一个独立的xml,默认yes; 如果设置 no 表示这个XML不是独立的而是依赖于外部的DTD约束文件
3.所以xml元素都必须是成对标签
4.标签名大小写敏感(区分大小写)
5.标签不能出现交叉情况
6.如出现特殊字符需要使用实体转义 如:<,>,",',&....
< ==== <
> ==== >
" ==== ”
' ==== ‘
& ==== &
元素属性
- 一个标签可以有多个属性
- 属性的值必须使用引号引起
- 命名规则:数字字母下划线,数字不能开头

所框部分即为属性,是name标签的属性
html中属性不可或缺,属性表示标签自身的一些额外信息
xml中属性几乎没用,在解析xml数据时,属性会带来额外的解析代码(多了一步,比较麻烦)
XML之CDATA节
用于把整段文本解析为纯字符串数据而不是标记的情况,其实包含在CDATA节中的特殊字符<、>、&都会当作字符展示
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<School>
<!--定义学生对象 这是一个注释-->
<Student>
<!--使用<![CDATA[xxx]]>可以把特殊字符当作文本-->
<name><![CDATA[我是一个"文本":想不到把]]></name>
</Student>
</School>
如果我不使用CDATA节包裹的话在文本区域输入<,>等就会和关键字符冲突,我们需要使用实体转义
注:特殊字符较少时,使用实体替换,较多时使用CDATA(注意大写)
xml的约束-dtd约束
约束的概念
DTD文档与XML文档实例关系如类与对象关系
规范xml编写的技术,必须按照约束中规定的内容进行编写

DTD约束
DTD声明
- DTD声明可以在单独的一个文件中;
- DTD声明可以内嵌在XML文件中;
- DTD声明可以一部分在单独的文件中,另一部分内嵌在XML文件中。
定义
DTD元素的定义(ELEMENT)
<!ELEMENT 元素名称(NAME) 元素类型(COUTENT)>
元素名称:就是自定义的子标签名称
元素类型:
- EMPTY:该元素不能包含子元素和文本,但是可以有属性,这类元素称为自闭和标签
<!ELEMENT elementName EMPTY> - ANY:该元素可以包含任意在DTD中定义的元素内容
- #PCDATA:可以包含任何字符数据,设置这个就不能包含子元素了,一般设置具体value
-
<!ELEMENT student (#PCDATA)> - 混合元素类型:只包含子元素,并且这些子元素没有文本
- 混合类型:包含子元素和文本数据混合体

DTD属性的定义(ATTLIST)
<!ATTLIST 元素名称 属性名称 类型 属性特点>
-
元素名称:我们自定义的元素名称
-
属性名称:我们自定义的元素名称:
3.类型:
- CDATA :该属性只能包含字符数据(注意与CDATA段、PCDATA的区别) ;
- NMTOKEN :是CDATA的子集,它的字符只能是字母,数字,句点,破折号,下划线或冒号;
- NMTOKENS :类似NMTOKEN,但这个可以包含多个值,每个值之间用空格隔开;
- ID : 该属性的取值在同一文档内是唯一的。一个元素只能有一个ID类型的属性;
- IDREF :类似指针,指向文档中其他地方声明的ID值。如果该属性取值和指向的ID值不匹配,则返回错误。
- IDREFS :类似IDREF,但它可以具有由空格分隔开的多个引用;
- ENTITY: 该属性的值必须对应一个在文档内部声明的但还没有分析过的实体;
- ENTITYS:类似ENTITY,但它可以包含由空格分隔开的多个实体;
- NOTATION :该属性的值必须引用在文档中其他地方声明的某个注释的名称;
- (enumerated) :类似枚举的变量,该属性必须匹配所列的值。各值用“|”分隔开。 如: (春|夏|秋|冬) 实际内容文档只能从中取一个。
4.属性特点
- #REQUIRED 必须有且只能有一个属性;
- #IMPLIED 可有可无;
- #FIXED 在DTD中定义默认值,XML中可以不指定,指定则必须等于该默认值;
- attribute-value 如果不指定则用DTD定义的默认值,指定则用指定的值。
DTD实体定义(ENTITY)
实体分类:
普通内部实体,普通外部实体,内部参数实体,外部参数实体
语法:
普通内部实体定义:
<!ENTITY 实体名 "实体值">
<!DOCTYPE doc [
<!ENTITY copyright "Copyright © 2024 by Example Corp.">
]>
<doc>©right;</doc>
在这个例子中,copyright 是一个内部实体,它被定义为包含版权声明的文本。在XML文档中,通过©right;引用这个实体。
普通外部实体引入:
<!ENTITY 实体名 SYSTEM "URI/URL">
<!DOCTYPE doc [
<!ENTITY externalData SYSTEM "data.txt">
]>
<doc>&externalData;</doc>
在这个例子中,externalData 是一个外部实体,它引用了一个名为data.txt的文件。在XML文档中,通过&externalData;引用这个实体,其内容将被插入到文档中。
内部参数实体定义:
<!ENTITY % 实体名 "实体值">
外部参数实体引入:
<!ENTITY % 实体名 SYSTEM "URI/URL">
内部DTD文档:
内部DTD允许你在同一个文档中定义和使用DTD,而不需要外部引用。然而,内部DTD也有其局限性,比如它们不能被缓存或共享,因为它们是文档的一部分。
<!DOCTYPE 根元素[定义元素属性等等内容]>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!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>
<!DOCTYPE note声明了文档类型,并且指定了DTD是针对<note>元素的。[...]内包含了DTD的详细定义,这些定义了文档的结构。<!ELEMENT ...>定义了元素的名称和它们可以包含的内容。#PCDATA表示元素可以包含解析过的字符数据。<note>是文档的根元素,它包含了<to>、<from>、<heading>和<body>元素。
外部DTD文档:
<!DOCTYPE 根元素 SYSTEM 'DTD文件路径'>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<!DOCTYPE note SYSTEM "note.dtd">声明了文档类型note,并且指定了DTD位于名为note.dtd的外部文件中。这个文件需要在系统的某个位置或者通过网络可访问。
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
这个DTD文件定义了XML文档中<note>元素的结构和它包含的子元素。每个<!ELEMENT ...>声明定义了一个元素的名称和它所包含的内容类型。#PCDATA代表被解析的字符数据,意味着元素可以包含文本。
内外部DTD文档结合:
<!DOCTYPE 根元素 SYSTEM 'DTD文件路径'[定义元素属性等等内容]>
外部DTD (book.dtd):这个文件定义了一些通用的结构和元素,可以被多个XML文档引用。
<!ENTITY % common-attrs "id CDATA #IMPLIED">
<!ELEMENT book (title, author+, genre, publish_date, summary)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT genre (#PCDATA)>
<!ELEMENT publish_date (#PCDATA)>
<!ELEMENT summary (#PCDATA)>
%common-attrs;
外部DTD (book.dtd) 定义了一本书的基本结构,包括标题、一个或多个作者、类型、出版日期和摘要。它还定义了一个公共属性集合 %common-attrs;。
XML文档:这个文档使用外部DTD定义的结构,并通过内部DTD进行扩展或修改。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "book.dtd">
<!DOCTYPE book [
<!ENTITY bookName "Mystic River">
<!ELEMENT book (title, author+, genre, publish_date, summary, price)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book
lang CDATA #REQUIRED
ISBN CDATA #REQUIRED
>
]>
<book lang="en" ISBN="123-456-789">
<title>&bookName;</title>
<author>Dennis Lehane</author>
<author>Additional Author</author>
<genre>Mystery</genre>
<publish_date>2001</publish_date>
<summary>A story of three childhood friends ... </summary>
<price>24.99</price>
</book>
-
XML文档首先通过
<!DOCTYPE book SYSTEM "book.dtd">声明引用外部DTD,然后通过<!DOCTYPE book [来引入内部DTD的定义。 -
内部DTD定义了一个新的
<price>元素,扩展了外部DTD的结构。它还为book元素添加了lang和ISBN属性,并要求它们必须提供(#REQUIRED)。 -
内部DTD还使用了一个实体
&bookName;来定义书籍的标题,这个实体在文档的标题元素中被引用。 -
最后,XML文档包含了所有必须的元素和属性,包括从外部DTD继承的和内部DTD新添加的。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)