ArcGIS客户端开发学习笔记(二)——XML

  XML是Extensible Markup Language(可扩展标记语言)的简称。XML是一种以简单文本格式存储数据的方式,这意味着它可以被任何计算机读取。XML是在Internet上传书数据的绝佳格式。通过使用XML,数据可存储于HTML之外。

  XML最大的优势在于:XML是跨平台的、用于传输信息且独立于软件和硬件的工具。

  下面举一个很简单的例子来说明它对于传输信息的重要性。

  Jani写给Tove的便签,存储为XML:

 

  
    
1 < note >
2   < to > Tove </ to >
3   < from > Jani </ from >
4   < heading > Reminder </ heading >
5   < body > Don't forget me this weekend! </ body >
6   </ note >

 

 

一、XML文档

 

  XML中的完整数据集就是XML文档。XML文档可以是计算机上的物理文件,获知内存中的字符串。但是其本身必须是完整的,必须遵循一定的规则。XML文档由许多不同的部分组成。其中最重要的部分是XML元素,它包括文档的实际数据。

1、XML元素

  XML元素包含一个开标记(放在尖括号中的元素名称,比如<myElement>)、元素中的数据和闭标记(与开标记想通,但是在左括号后有一个斜线:</myElement>)。例如定义一个存储书名的元素:

  
    
1 < book > Tristram Shandy </ book >  

 

  注意:元素是区分大小写的!例如:<book>和<Book>是不同的!

  元素也可以包含其他元素,因此可以修改此<book>元素,添加两个子元素,使之包括作者和标题:

 

  
    
1 < book >
2 < title > Tristram Shandy </ title >
3 < author > Lawrence Sterne </ author >
4 </ book >
5

 

  但是元素不允许重叠!例如:

 

  
    
< book >
< title > Tristram Shandy
< author > Lawrence Sterne
</ title ></ author >
</ book >

 

  这样是错误的!

2、XML属性

  与在元素体内存储数据一样,也可以在属性内存储数据,属性添加到元素的开标记内。属性的形式为:

  Name = “value”

  其中属性值必须包含在单引号或者双引号内。例如:

 

  
    
< book title =”Tristram Shandy” ></ book >

 

  或者:

 

  
    
< book title = ‘Tristram Shandy’ ></ book >

 

3、XML声明

  XML文档的各个组成部分称为节点----因此元素、元素内的文本和属性都是XML文档的节点。但是只有一种类型的节点存在几乎所有的XML文档中,这就是XML声明,如果包括了它,它就必须是文档的第一个节点。

  XML声明的格式类似于元素,但是在尖括号内有问号。它一贯的名称是xml,并总是有version属性。最简单的XML声明形式为:

 

  
    
<? xml version = “1.0” ?>

 

4、XML文档的结构

  XML数据是分层组织的,有点类似于Windows Explorer中的文件夹和文件。每一个文档必须有一个根元素,该元素是所有其他元素的父元素。XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。在这个根元素下包含了其他所有的元素和文本数据。如果在文档的顶级中有多个元素,改文档就是不合法的XML文档。但是可以在顶级包括其他XML节点,所有元素均可拥有子元素。所有的XML元素都必需有闭标签。下面的XML文档是合法的:

 

  
    
1 <? xml version=’1.0’ ?>
2 < books >
3 < book > Mody Dick </ book >
4 < book > Tristram Shandy </ book >
5 < book > Ulysses </ book >
6 </ books >
7  

  但是下面的文档就不合法:

 

 

  
    
<? xml version=’1.0’ ?>
< book > Mody Dick </ book >
< book > Tristram Shandy </ book >
< book > Ulysses </ book >

 

  XML文档不需要任何预定义的结构。这是传统关系数据库和XML的主要区别之一。信息存储在XML中时不需要这个初始设置,所以XML是存储小块数据的非常方便的方式。

5、XML命名空间

  先来看看下面的例子。一个XML文档中包含了一个表格的信息:

 

  
    
1 < table >
2 < tr >
3 < td > Apples </ td >
4 < td > Bananas </ td >
5 </ tr >
6 </ table >
7

 

  而另一个文档中包含了一个桌子的信息(一件家具):

 

  
    
1 < table >
2 < name > African Coffee Table </ name >
3 < width > 80 </ width >
4 < length > 120 </ length >
5 </ table >
6

 

  假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突。怎么解决呢?有两种方法,一种是使用前缀,一种是使用命名空间。

  1)使用前缀

  带有表格信息的文档:

 

  
    
1 < h:table >
2 < h:tr >
3 < h:td > Apples </ h:td >
4 < h:td > Bananas </ h:td >
5 </ h:tr >
6 </ h:table >
7

 

  带有桌子信息的文档:

 

  
    
< f:table >
< f:name > African Coffee Table </ f:name >
< f:width > 80 </ f:width >
< f:length > 120 </ f:length >
</ f:table >

 

  现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table> 元素 (<h:table> 和 <f:table>)。通过使用前缀,我们创建了两种不同类型的 <table> 元素。

  2)使用命名空间

  带有表格信息的文档:

 

  
    
< 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.cn/furniture" >
< f:name > African Coffee Table </ f:name >
< f:width > 80 </ f:width >
< f:length > 120 </ f:length >
</ f:table >

 

  与使用前缀不同,我们为<table> 标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。与使用前缀相比,感觉使用命名空间不过是在<table>标签上多加了个xmlns的属性而已,既然效果一样,为什么还要多次一举呢(多加一个标签)?至于为什么要使用命名空间的好处,我的理解还不是很深刻,请大家多多赐教。

 

 

二、XML文档的验证

 

  现在一般使用两种验证方法:XMLDTD和XML Schema。

1、XML DTD

  文档类型定义(DTD)可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档中,也可作为一个外部引用。

带有 DTD 的 XML 文档实例(请在 IE5 以及更高的版本打开,并选择查看源代码):

 

代码
   
     
1 <? xml version="1.0" ?>
2   <! DOCTYPE note [ <!--定义此文档是 note 类型的文档-- >
3 <! ELEMENT note (to,from,heading,body) > <!-- 定义 note 元素有四个元素:"to、from、heading,、body" -->
4 <! ELEMENT to (#PCDATA) > <!-- 定义 to 元素为 "#PCDATA" 类型 -->
5 <! ELEMENT from (#PCDATA) > <!-- 定义 frome 元素为 "#PCDATA" 类型 -->
6 <! ELEMENT heading (#PCDATA) > <!-- 定义 heading 元素为 "#PCDATA" 类型 -->
7 <! ELEMENT body (#PCDATA) > <!-- 定义 body 元素为 "#PCDATA" 类型 -->
8 ]>
9   < note >
10 < to > George </ to >
11 < from > John </ from >
12 < heading > Reminder </ heading >
13 < body > Don't forget the meeting! </ body >
14   </ note >
15  

  具体内容参考http://www.w3cschool.cn上的标准。

2、XML Schema

  XML Schema 是基于 XML 的 DTD 替代者。

  XML Schema 描述 XML 文档的结构。

  XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

  这部分的内容太多了,改天专门整理一个文档。具体内容参考http://www.w3cschool.cn上的标准。

 

 

三、使用javascript解析XML

 

  创建的book.xml如下:

 

代码
   
     
1 <? xml version="1.0" encoding="utf-8" ?>
2 < books >
3 < book title ="平凡的世界" >
4 < author > 路遥 </ author >
5 </ book >
6 < book title ="水浒传" >
7 < author > 施耐庵、罗贯中 </ author >
8 </ book >
9 < book title ="西游记" >
10 < author > 吴承恩 </ author >
11 </ book >
12 </ books >
13

 

  客户端代码如下:

 

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

< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title > 使用javascript解析XML </ title >
< script type ="text/javascript" language ="javascript" >
function CreateXMLParser(xmlDocPath) // 创建XML文档解析器
{
var parser;
try
{
// 使用IE浏览器
parser = new ActiveXObject( " Microsoft.XMLDOM " ); // 创建一个空的微软XML文档对象
}
catch (e)
{
try
{
// 使用Firefox,Mozilla,Opera浏览器
parser = document.implementation.createDocument( "" , "" , null );
}
catch (e)
{
alert(
" 您的浏览器不支持对XML文档的解析,请您升级浏览器 " );
return null ;
}
}
parser.async
= " false " ; // 关闭异步加载,确保在文档完全加载之前解析器不会继续脚本的执行
parser.load(xmlDocPath); // 加载名为“book,xml”的XML文档
return parser;
}
function getMsgFromXMLDoc(xmlDocPath) // 从xml文档中读取信息
{
var xmlParser = CreateXMLParser(xmlDocPath);
if (xmlParser == null )
return ;

// 开始从xml解析器中读取信息
var msg = "" ;
var books = xmlParser.getElementsByTagName( " book " ); // 得到xml文档中所有的<book>元素
for ( var i = 0 ;i < books.length;i ++ ) // 遍历所有的<book>元素
{
var book = books[i]; // 得到一个book元素
msg = msg + " 书名: " ;
msg
= msg + book.attributes[ 0 ].value; // 读取book元素的属性
msg = msg + " 作者: " ;
msg
= msg + book.childNodes[ 0 ].text; // 读取book元素的子元素中的数据
msg = msg + " \n " ;
}
alert(msg);
}

</ script >
</ head >
< body onload ="getMsgFromXMLDoc('book.xml')" >
</ body >
</ html >

 

  从上面的代码得知,使用javascript解析xml需要如下步骤:

  1、创建xml解析器。IE浏览器使用ActiveXObjec。其他浏览器使用document.implementation.createDocument()方法。

  2、关闭异步加载。

  3、加载XML文档。

  4、读取XML文档的信息。

  本文参考了http://www.w3cschool.cn上大量的标准和教程,大家可以在这个网站得到更多关于XML和其他Web技术的标准和教程。

你可能感兴趣的:(arcgis)