XML入门的小介绍

cc 03-05-31


XML入门的小介绍

一、小格式

格式自是不用说了。稍有基础的人应该看懂如下最简单的表示:
<?xml version="1.0"?>
<address>
<name>
<title>cc</title>
<first-name>
cc
</first-name>
<last-name>
McGoon
</last-name>
</name>
<street>
1401 Main Street
</street>
</address>

二、定义文档规范

但实际上,我们在写上面代码的时候要先定义XML的格式(语法规则),就好像要先生命变量再给变量赋值一样。

一种语法规则是DTD,DTD 语法不同于普通的 XML 语法。
另一种是XML Schema ,相对比较复杂的定义,XML Schema本身就是XML。

这是DTD的格式:
<!-- address.dtd -->
<!ELEMENT address (name, street)>
<!ELEMENT name (title? first-name, last-name)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>

这是XML Schema的格式:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="address">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="name"/>
<xsd:element ref="street"/>
<xsd:element ref="city"/>
<xsd:element ref="state"/>
<xsd:element ref="postal-code"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="name">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="title" minOccurs="0"/>
<xsd:element ref="first-Name"/>
<xsd:element ref="last-Name"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

<xsd:element name="title" type="xsd:string"/>
<xsd:element name="first-Name" type="xsd:string"/>
<xsd:element name="last-Name" type="xsd:string"/>
<xsd:element name="street" type="xsd:string"/>
</xsd:schema>

看起来啊XML Schema是很强大的定义语言。里面可以包含一些构造XML的逻辑,这里先不说了,大体上先有个印象吧。实际上一般的应用使用DTD足以了,我是比较喜欢用DTD定义。

以上的这些定义语句,放在XML文件的最上部分。例如:
<?xml version="1.0"?>
<!-- address.dtd -->
<!ELEMENT address (name, street)>
<!ELEMENT name (title? first-name, last-name)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT first-name (#PCDATA)>
<!ELEMENT last-name (#PCDATA)>
<!ELEMENT street (#PCDATA)>
<address>
<name>
<title>cc</title>
<first-name>
cc
</first-name>
<last-name>
McGoon
</last-name>
</name>
<street>
1401 Main Street
</street>
</address>

三、解析器

XML定义完成以后,要想在java中使用,必须用解析器。解析器有标准的JDOM,SAX。

JDOM 的主要特性是它极大地减少了编写的代码数量。网上有jar包下载,例如jive论坛中的配置文件就有使用。仔细看看jive中如何使用Jdom的会比较受启发。我确实把jive中的那部分抽象提取出来了,作为自己的配置文件读取器。

四、疑点

命名空间-当你的XML发布在互联网上后,你自己定义的address会跟其他很多人的address重复。怎么区分呢?

<?xml version="1.0"?>
<customer_summary
xmlns:addr="http://www.xyz.com/addresses/"
xmlns:books="http://www.zyx.com/books/"
xmlns:mortgage="http://www.yyz.com/title/"
>
... <addr:name><title>Mrs.</title> ... </addr:name> ...
... <books:title>Lord of the Rings</books:title> ...
... <mortgage:title>NC2948-388-1983</mortgage:title> ...


最后要指出的是:名称空间定义中的字符串仅仅是字符串。对,这些字符串看似 URL,其实不是。您可以定义 xmlns:addr="mike",那也是有效的。名称空间唯一的重要性在于其唯一性;这就是为什么大多数名称空间定义看起来象 URL 的原因。XML 解析器不会到http://www.zyx.com/books/ 去搜索 DTD 或模式,它只是把那个文本作为字符串使用。这有些令人困惑,但名称空间就是这样工作的。


还是理解不出命名空间的意义有多大!?谁能说一下啊??