XML学习

发布时间 2023-04-23 19:40:24作者: kalixcn

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["开始,由"]]>结束;