XML1.0

所有的XML文档都源自XML1.0推荐标准,可以到 http://www.w3.org/TR/REC-xml  查看完整的标准。XML文档可以分为个基本的组成部分头部(header),用于为XML解析器和XML程序提供如何处理文档的信息;内容(content),也就是XML数据本身。虽然这种划分很宽泛,但它有助于将XML文档中给应用程序的指示和文档内容本身区分开来。作为开发人员,理解这种划分是非常重要的。头部就是XML声明,其格式如下:

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

头部中还可以包含XML文档的编码方式和说明文档是独立的还是要引用其他文档才算完整的standalone属性

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

头部的其余部分由多个DOCTYPE声明之类的项组成(也可以没有):

<!DOCTYPE RDF SYSTEM "DTDs/RDF-gaiman.dtd">

从上面的声明可以看出,该声明引用了本机DTD目录下的RDF-gaiman.dtd文件。只要你引用的是自己系统中的文件,不管使用的是相对路径还是绝对路径,或者是URL,都要加上SYSTEM关键字。与之相对的另一个关键字是PUBLIC,其后接一个公共的标识符。这意味着W3C或其他组织已经定义了该标识符所指定的标准DTD,例如,XHTML1.0的DTD语句如下所示:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

这里提供了公共标识符(以“-//”开头的字符串),后面是个系统标识符(URL)。如果公共标识符无法解析,那就会使用系统标识符来代替。

在文件头部,可能还会看到处理指令(processing instruction),它们通常被认为是XML文档头部的一部分,而不是内容。这些指令看起来就像下面这个样子:

<?xml-stylesheet href="XSL/JavaXML.html.xsl" type="text/xsl"?>
<?xml-stylesheet href="XSL/JavaXML.wml.xsl" type="text/xsl" media="wap"?>
<?cocoon-process type="xslt"?>

每条处理指令都有一个目标(即第一个单词,如xml-stylesheet 或 cocoon-process)和数据(其余部分)。通常情况下,数据都是以名-值对的形式显示,这样有助于提高可读性。

根元素

在XML文档中,根元素是最高级别的元素,它是文档中第一个开始且最后一个结束的标签。它提供了一个参考点,使得XML解析器或者支持XML的应用程序能够识别出XML文档的起止位置。下例中,根元素 是RDF:

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:" xmlns:admin="http://webns.net/mvcb/"
    xmlns:l="http://purl.org/rss/1.0/modules/link/"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">

    <!-- Document content -->
</rdf:RDF>

该标签及其匹配的结束标签之间涵盖了XML文档中全部其他数据内容。XML中规定在一个XML文档中只能有一个根元素,换句话说,根元素必须囊括文档中其他的所有元素。除了这点要求之外,根元素与其他XML元素之间没有区别。理解这一点是非常重要的,因为XML文档能够引用和包含其他的XML文档。在这种情况下,被引用文档的根元素在引用文档中就变成了一个内置元素,它必须能够被XML解析器正常地进行处理,将根元素定义为不使用任何属性或行为的标准XML元素 ,可以使文档的嵌入很好地运作。

元素

元素可以使用任意的名称表示且必须放置在一对尖括号。下面示例演示了几种不同类型的元素(注:这并不是一个真正的文档,只是展示一些示例而已):

<!-- 标准元素的起始标签 -->
<items>

<!-- 标准的带属性的元素  -->
<rdf:li rdf:resource="http://www.neilgaiman.com/journal/2005/04/three-photographs.asp">

<!-- 带有文本数据的元素 -->
<dc:creator>Neil Gaiman</dc:creator>

<!-- 空元素 -->
<l:permalink l:type="text/html" rdf:resource=" />

<!-- 标准元素的结束标签 -->
</items>

创建元素的第一条规则是,元素的名称必须以字母或者下划线开头,可以包含任意数目的字母数字下划线连字符句点,但不可以内嵌空格

<!-- 不能内嵌空格 ,这是错误的-->
<my element name>

XML元素名是大小写敏感的。一般说来,使用与Java相同的命名规则就可以得到比较好的XML元素名。请记住,你的XML文档很可能会有其他的开发人员和内容创作人员需要阅读,因此通过好的命名方式来构建一个清楚的文档是非常重要的。

每一个开始标签都必须依次有对应的结束标签。与HTML等其他标签语言一样,这一规则必须遵守。结束标签是由斜线和元素名组成,如</items>。在开始标签和结束标签之间,可以有任意多的其他元素或文档数据。不过,你不能打乱这些元素的嵌套顺序,第一个起始的元素必须总是最后一个结束。如果在XML文档中有任何一条语法规则没有被遵守,那就不是格式良好的XML文档。下面的XML片段是一个非格式良好的XML文档的示例:

<tag1>        <!-- 不是格式良好的 -->
    <tag2>
</tag1>
    </tag2>

这里,标签的嵌套顺序是错误的。但是请注意,在HTML中,这样是可以的,而且在包含大量表格的HTML文件中经常会出现。换言之,HTML和许多其他的标签语言并不要求要遵守格式良好的XML文档中的语法。在XML中必须严格遵守排列和嵌套规则,这样在解析和处理数据时比其他没有这些约束条件的标签语言要快得多。

最后一条规则,让我们来讨论一下空元素,前面曾经提过,XML标签必须成对出现,开始标签和结束标签构成了一个完整的XML元素。在某些情况下:

<admin:generatorAgent rdf:resource="http://www.blogger.com/"></admin:generatorAgent>
<img src="/images/xml.gif"></img>

很显然这有点笨,并且还往往会给大型的XML文档添乱。XML标准提供了在一个元素中同时表示开始标签和结束标签的方法

<admin:generatorAgent rdf:resource="   />
<img src="/images/xml.gif"   />

注:最后那个斜杠前面的空格是怎么回事?一二十年前,当时的一些浏览器(直到今天还有一些也是如此)只能接受固定格式的XHTML(一种格式良好的HTML)。最明显的就是<br>这样在HTML中从来都不需要结束的标签,而在XHTML中就必须要有结束标签,也就是</br>。有些浏览器会完全忽略此类标签,然而,奇怪的是,它们非常乐意处理<br  />(注意斜杠前面的空格)。我已经习惯于让我的XML文档不仅是格式良好的,而且能够被这些浏览器使用

属性

在一个元素标签中,除了所包含的文本外,元素还可以有属性(attribute)属性及其值包含在元素的开始标签中。例如:

<channel rdf:about="http://www.neilgaiman.com/journal/jouuranl.asp">

在这个例子中,属性名是rdf:about,值是URL "http://www.neilgaiman.com/journal/journal.asp"。属性名必须遵循XML元素的命名规则,并且属性值必须放在引号内。尽管单引号双引号都可以使用,但使用双引号已经成为一种广泛使用的标准

由于XML支持多种数据格式,所以很少有不能用元素描述的属性或者不能轻易转换为属性的元素。尽管没有专门的规范或者广泛接受的标准来定义何时使用属性及何时使用元素。但是有一个良好的经验法则:多值数据用元素 ,单值数据用属性。如果数据有多个值,或者很长,那很可能要用元素来表示。如果数据主要是以单个值来表示,那么它最好用属性来表示。

名称空间(命名空间)

前面讲的示例:

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:" xmlns:admin="http://webns.net/mvcb/"
    xmlns:l="http://purl.org/rss/1.0/modules/link/"
    xmlns:content="http://purl.org/rss/1.0/modules/content/">

    <!-- Document content -->
</rdf:RDF>

XML名称空间(namespace)是将XML文档中的一个或者多个元素与特定的URI关联起来的一种方法。这意味着元素是由它的名称和名称空间URI来标识的。在许多复杂的XML文档中,对同一个XML名称(例如author)可以有不同的使用方式。例如,在本例中,一个RSS源会有一个作者(author),同时每一篇期刊文章也会有一个作者(author),虽然这些数据都可以放在名为author的元素中,但他们不应该被视为同一类型的数据。

XML名称空间标准很好地解决了这一问题。标准要求,用唯一的URI加上前缀的形式来将一个名称空间的元素与来自其他名称空间的元素区分开。因此,你可以指定一个URI,如 http://www.neilgaiman.com/eniries,与前缀journal关联,来表示特定的journal元素。再另外指定一个URI,如http://www.w3.org/1999/02/22-rdf-syntax-ns,和前缀rss来表示特定的rss元素:

<rdf:RDF xmlns:rss="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:journal="http://www.neilgaiman.com/entries">

现在,你可以在XML文档中使用上述前缀了:

<rss:author>Doug Hally</rss:author>
<journal:author>Neil Gaiman</journal:author>

这样,不仅XML解析器现在能够很容易的区分这两种不同类型的author元素,而且还提高了XML文档的可读性。

实体引用

现在我们来讨论转义字符。例如,在联机文档中有这样的文本数据:

I think I lokk alittle dazed.<br /><br />
<img src="http://www.neilgaiman.com/journal/Neil_8313036.jpg" ><br />

问题在于,XML解析器会试图把这些数据(<br />和<img>)当作XML标签来处理。这是一个很常见的问题,因为只要使用尖括号字符就会出现这个问题。实体引用(entity reference)提供了一种解决这一问题折方法。实体引用是XML中的一种特殊的数据类型,可用于引用另外一些数据。实体引用唯一名,前加一个“”符号,后跟一个“”符号组成,即&[entity name];。当XML解析器发现一个实体引用时,就会插入指定的替换值,不对该值进行任何处理。XML中定义了五种实体引用来解决示例中所讨论的问题:&lt; 用于表示“<”,&gt; 用于表示“>”,&amp; 用于表示“”,&quot; 用于表示“ ”,&apos; 用于表示“ ' ”。使用这些特定的实体引用,文章中就可以包括HTML标签了,而XML解析器也不会把他当作XML标签来解释。

I think I lokk alittle dazed. &lt;br /&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.neilgaiman.com/journal/Neil_8313036.jpg&quot; &gt;&lt;br /&gt;

当文档被解析时,数据会被解析为普通的HTML br和img标签,而且文档仍然被认为是格式良好的。

还要注意,实体引用可以由用户进行定义。因此可以使用快捷标记。例如,你可能想要引用某个在线的版权声明。因为许多书籍和文章都要用到这个版权声明,在数百份不同的XML文档中都包含实际的文本数据,但是这毫无意义。而且,如果版本声明有所变更,所有涉及到的XML文档都应该做出改变:

<ora:copyright>&OReillyCopyright;</ora:copyright>

在XML解析器访问&OReillyCopyright;时,虽然目前你还不明白它是怎么知道要引用什么的。但是,到后面blog中,你就会了解到实体引用的用处不仅仅是表示数据中难以表达和不常用的字符。

非解析数据

最后要讲述的一种XML结构是CDATA段标记CDATA段标记主要用于大量的数据不经XML解析而传送给调用的应用程序时。当大量字符需要使用实体引用转义,或者要保留空格时,也会用到。在XML文档中,CDATA段标记如下所示:

<content:encoded><![CDATA[ Lot of flying yesterday and now I'm home again. 
For a day. Last night's useful post was written,but was eaten by weasels.
Next week is the last week of <em>Beowulf- </em> with-Avary-and-Zemeckis work
for a long while,and then I get to be home for about a month,if you
don't count the trip to New York for Book Expo, and right new I just
like the idea of sleeping in my own bed for acouple of nights runnig.
<br /><br /> </p>]]></content:encoded>

本段例中,CDATA段标记中的所有信息都不必使用实体引用或者其他机制来通知解析器。相反,XML解析器会将数据原封不动地传递给应用程序。

你可能感兴趣的:(xml与java)