xml基础

XML

XML 指可扩展标记语言(eXtensible Markup Language)。

XML 具有出色的自我描述性

XML 被设计用来传输和存储数据。 HTML 被设计用来显示数据。

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

    <bookstore>
        <book category="COOKING">
            <title lang="en">Everyday Italian</title>
            <author>Giada De Laurentiis</author>
            <year>2005</year>
            <price>30.00</price>
        </book>
        <book category="CHILDREN">
            <title lang="en">Harry Potter</title>
            <author>J K. Rowling</author>
            <year>2005</year>
            <price>29.99</price>
        </book>
            <book category="WEB">
            <title lang="en">Learning XML</title>
            <author>Erik T. Ray</author>
            <year>2003</year>
            <price>39.95</price>
        </book>
    </bookstore>

XML 声明文件的可选部分,如果存在需要放在文档的第一行

<?xml version="1.0" encoding="utf-8"?>

xml版本 所使用编码

省略关闭标签是非法的 所有的 XML 元素都必须有一个关闭标签 声明不属于xml文档的一部分,所以不需要闭合

XML 标签对大小写敏感。标签 <Letter> 与标签 <letter> 是不同的。

XML 元素也可拥有属性(名称/值的对) 类似html标签的属性 单引号和双引号都是允许的,但必须任选其一

不过应该尽可能避免大量的使用属性

元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

  1. 属性不能包含多个值(元素可以)
  2. 属性不能包含树结构(元素可以)
  3. 属性不容易扩展(为未来的变化)

在xml中,<和&是非法的,<会被认为是新元素的开始,”&” 也会产生错误,因为解析器会把该字符解释为字符实体的开始。可以采用实体引用来代替相应字符 |实体引用|字符|说明| |—|—|—| |&lt;|<|less than| |&gt;|>|greater than| |&amp;|&|ampersand| |&apos;|’|apostrophe| |&quot;|”|quotation mark|

在 XML 中编写注释的语法与 HTML 的语法很相似。

<!-- This is a comment -->

HTML 会把多个连续的空格字符裁减(合并)为一个

在 XML 中,文档中的空格不会被删减

XML 命名规则

  1. 名称可以包含字母、数字以及其他的字符
  2. 名称不能以数字或者标点符号开始
  3. 名称不能以字母 xml(或者 XML、Xml 等等)开始
  4. 名称不能包含空格
  5. 可使用任何名称,没有保留的字词。

避免 "-" 字符。"first-name",一些软件会认为您想要 从 first 里边减去 name。

避免 "." 字符。"first.name",一些软件会认为 “name” 是对象 “first” 的属性。

避免 ":" 字符。冒号会被转换为命名空间来使用

XML 元素是可扩展的,以携带更多的信息。也就是说接收xml的应用程序不会因为遇到为被定义的信息或元素就中断运行

但是如果遇到语法错误就会终止XML应用程序,所以需要对xml文档进行验证

合法的 XML 文档是”形式良好”的 XML 文档,这也符合文档类型定义(DTD)的规则

<?xml version="1.0" encoding="ISO-8859-1"?>
<!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 声明是对外部 DTD 文件的引用

DTD教程

W3C 同时支持一种基于 XML 的 DTD 代替者,它名为 XML Schema

<xs:element name="note">

<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>

</xs:element>

XML Schema教程

可以使用css来格式化xml文档,但并不推荐,方式与格式化html文档相同

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
<CATALOG>
<CD>
</CD>
</CATALOG>

W3C推荐使用XML XSLT来格式化XML文档

XML XSLT教程

####XML命名空间

如果两个具有相同元素名称的xml文档被同时使用,有可能造成命名冲突,可以用命名空间规避这种问题

<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 属性中定义的。

命名空间声明的语法如下。xmlns:前缀=”URI”

命名空间 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>

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

命名空间,可以在他们被使用的元素中或者在 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>

####XML CDATA

XML 解析器通常会解析 XML 文档中所有的文本

当某个 XML 元素被解析时,其标签之间的文本也会被解析

而CDATA可以规定哪些片段是不应被解析的

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>

CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分

标记 CDATA 部分结尾的 “]]>” 不能包含空格或换行

####<p id="DTD">DTD</p>

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中

<!DOCTYPE root-element [element-declarations]>

<?xml version="1.0"?>
<!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>

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中

<!DOCTYPE root-element SYSTEM "filename">

<?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>

####XML 文档构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

声明一个元素

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

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

<!ELEMENT element-name EMPTY>

实例:

<!ELEMENT br EMPTY>

XML example:

<br />

只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

<!ELEMENT element-name (#PCDATA)>

实例:

<!ELEMENT from (#PCDATA)>

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

<!ELEMENT element-name ANY>

实例:

<!ELEMENT note ANY>

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

<!ELEMENT element-name (child1)>
或
<!ELEMENT element-name (child1,child2,...)>

实例:

<!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)>

上面的例子声明了:message 子元素必须出现一次,并且必须只在 “note” 元素中出现一次。

声明最少出现一次的元素

<!ELEMENT element-name (child-name+)>

实例:

<!ELEMENT note (message+)>

上面的例子中的加号(+)声明了:message 子元素必须在 “note” 元素内出现至少一次。

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

<!ELEMENT element-name (child-name*)>

实例:

<!ELEMENT note (message*)>

上面的例子中的星号(*)声明了:子元素 message 可在 “note” 元素内出现零次或多次。 声明出现零次或一次的元素

<!ELEMENT element-name (child-name?)>

实例:

<!ELEMENT note (message?)>

上面的例子中的问号(?)声明了:子元素 message 可在 “note” 元素内出现零次或一次。 声明”非…/既…“类型的内容 实例:

<!ELEMENT note (to,from,header,(message|body))> 上面的例子声明了:”note” 元素必须包含 “to” 元素、”from” 元素、”header” 元素,以及非 “message” 元素既 “body” 元素。 声明混合型的内容 实例:

<!ELEMENT note (#PCDATA|to|from|header|message)*> 上面的例子声明了:”note” 元素可包含出现零次或多次的 PCDATA、”to”、”from”、”header” 或者 “message”。