XML入门的小介绍

03-05-31 cc

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 或模式,它只是把那个文本作为字符串使用。这有些令人困惑,但名称空间就是这样工作的。

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