xml编程与应用教程(什么是网页XML编程)

:暂无数据 2025-09-02 03:00:01 0
本篇文章给大家谈谈xml编程与应用教程,以及什么是网页XML编程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录

什么是网页XML编程

一. 什么是XML?
这往往是第一个问题,也往往在第一个问题上你就会搞不明白,因为大多的教材上这样回答:
XML是Extensible Markup Language的简写,一种扩展性标识语言。 这是标准的定义。那么什么是标志语言,为什么叫扩展性?已经让人有些糊涂。我想我们这样来理解会好一些:
对HTML你已经非常熟悉了吧,它就是一种标记语言,记得它的全称吗:"Hypertext Markup Language" 超文本标记语言。明白了?同时,HTML里面有很多标签,类似,等,都是在HTML 4.0里规范和定义,而XML里允许你自己创建这样的标签,所以叫做可扩展性。
这里有几个容易混淆的概念要提醒大家:
1.XML并不是标记语言。它只是用来创造标记语言(比如HTML)的元语言。天,又糊涂了!不要紧,你只要知道这一点:XML和HTML是不一样的,它的用处途比HTML广泛得多,我们将在后面仔细介绍。
2.XML并不是HTML的替代产品。XML不是HTML的升级,它只是HTML的补充,为HTML扩展更多功能。我们仍将在较长的一段时间里继续使用HTML。(但值得注意的是HTML的升级版本XHTML的确正在向适应XML靠拢。)
3.不能用XML来直接写网页。即便是包含了XML数据,依然要转换成HTML格式才能在浏览器上显示。
下面就是一段XML示例文档(例1),用来表示本文的信息:
《myfile》《br》《br》
《title》XML Quick Start《/title》《br》《br》
《author》ajie《/author》《br》《br》
《email》ajie@aolhoo.com《/email》《br》《br》
《date》20010115《/date》《br》《br》
《/myfile》
注意:
1.这段代码仅仅是代码,让你初步感性认识一下XML,并不能实现什么具体应用;
2.其中类似《 title》,《author》的语句就是自己创建的标记(tags),它们和HTML标记不一样,例如这里的《title》是文章标题的意思,HTML里的《title》是页面标题。

二. XML是新概念吗?
不是。XML来源于**ML,一种比HTML更早的标志语言标准。
关于**ML,我们来简单了解一下,你只需要有个大致概念就可以。
**ML全称是"Standard Generalized Markup Language"(通用标识语言标准)。看名称就知道:它是标志语言的标准,也就是说所有标志语言都是依照**ML制定的,当然包括HTML。**ML的覆盖面很广,凡是有一定格式的文件都属于**ML,比如报告,乐谱等等,HTML是**ML在网络上最常见的文件格式。因此,人们戏称**ML是HTML的"妈妈"。
而XML就是**ML的简化版,只不过省略了其中复杂和不常用的部分。和**ML一样,XML也可以应用在金融,科研等各个领域,我们这里讲的,只是XML在web方面的运用而已。
到这里,你应该有点明白了:XML是用来创建定义类似HTML的标记语言,然后再用这个标记语言来显示信息。

三. 使用XML有什么好处?
有了HTML,为什么还需要用XML?
因为现在网络应用越来越广泛,仅仅靠HTML单一文件类型来处理千变万化的文档和数据已经力不丛心,而且HTML本身语法十分不严密,严重影响网络信息传送和共享。人们早已经开始探讨用什么方法来满足网络上各种应用的需要。使用**ML是可以的,但**ML太庞大,编程复杂,于是最终选择了"减肥"的**ML---XML作为下一代web运用的数据传输和交互的工具。
使用XML有什么好处?来看w3c组织(XML标准制定者)的说明:
XML使得在网络上使用**ML语言更加"简单和直接": 简化了定义文件类型的过程,简化了编程和处理**ML文件的过程,简化了在Web上的传送和共享。
1.XML可以广泛的运用于web的任何地方;
2.XML可以满足网络应用的需求;
3.使用XML将使编程更加简单;
4.XML便于学习和创建;
5.XML代码将清晰和便于阅读理解;
还是抽象了些。让我们在后面的实例教程中慢满体会XML的强大优势吧!
四. XML很难学吗?
如果你有兴趣学习XML,不禁会问:XML难吗?学习XML需要什么样的基础?
XML非常简单,学习容易。如果你熟悉HTML,你会发现它的文档和HTML非常相似,看同样的示例文档(例1):
《?xml version="1.0"?》《br》《br》
《myfile》《br》《br》
《title》XML Quick Start《/title》《br》《br》
《author》ajie《/author》《br》《br》
《email》ajie@aolhoo.com《/email》《br》《br》
《date》20010115《/date》《br》《br》
《/myfile》
第一行是一个XML声明,表示文档遵循的是XML的1.0 版的规范。
第二行定义了文档里面的第一个元素(element),也称为根元素: 《myfile》。这个就类似HTML里的《HTML》开头标记。注意,这个名称是自己随便定义的。
再下面定义了四个子元素:title,author,email,和date。分别说明文章的标题,作者,邮箱和日期。当然,你可以用中文来定义这些标签,看上去更便于理解:
《?xml version="1.0" encoding="GB2312"?》
《文章》
《标题》XML轻松学习手册《/标题》
《作者》ajie《/作者》
《信箱》ajie@aolhoo.com《/信箱》
《日期》20010115《/日期》
《/文章》
这就是XML的文档,任何掌握HTML的网友都可以直接写出这样简单的XML文档。
另外,学习XML还必须掌握一种页面脚本语言,常见的就是javascript和VB script。因为XML数据是使用script实现HTML中调用和交互的。我们看一个最简单的例子(例2):
1.将下面代码存为myfile.htm
《html》
《head》
《script language="JavaScript" for="window" event="onload"》
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("myfile.xml");
nodes = xmlDoc.documentElement.childNodes;
title.innerText = nodesitem(0).text;
author.innerText = nodes.item(1).text;
email.innerText = nodes.item(2).text;
date.innerText = nodes.item(3).text;
《/script》
《title》在HTML中调用XML数据《/title》
《/head》
《body bgcolor="#FFFFFF"》
《b》标题: 《/b》
《span id="title"》 《/span》
《b》作者: 《/b》》
《span id="author"》《/span》
《b》信箱: 《/b》
《span id="email"》《/span》
《b》日期:《/b》
《span id="date"》《/span》
《/body》《br》《br》
《/html》《br》《br》
2.将下面代码存为myfile.xml
《?xml version="1.0" encoding="GB2312"?》
《myfile》
《title》XML轻松学习手册《/title》
《author》ajie《/author》
《email》ajie@aolhoo.com《/email》
《date》20010115《/date》
《/myfile》
3.将它们放在同一个目录下,用IE5以上版本浏览器打开,可以看到效果。 学习并掌握一种script,你将真正了解到XML无比的强大的功能。

五. XML和HTML的区别
XML和HTML都来自于**ML,它们都含有标记,有着相似的语法,HTML和XML的最大区别在于:HTML是一个定型的标记语言,它用固有的标记来描述,显示网页内容。比如《 H1》表示首行标题,有固定的尺寸。相对的,XML则没有固定的标记,XML不能描述网页具体的外观,内容,它只是描述内容的数据形式和结构。
质的区别:网页将数据和显示混在一起,而XML则将数据和显示分开来。
我们看上面的例子,在myfile.htm中,我们只关心页面的显示方式,我们可以设计不同的界面,用不同的方式来排版页面,但数据是储存在myfile.xml中,不需要任何改变。
(如果你是程序员,你会惊讶的发现,这与模块化面向对象编程的思想极其相似!其实网页何尝不是一种程序呢?)
正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据处理方法,将使网络跨越到一个新的境界。

六. XML的严格格式
吸取HTML松散格式带来的经验教训,XML一开始就坚持实行"良好的格式"。
在XML文档中:
1.所有的标记都必须要有一个相应的结束标记;
2.所有的XML标记都必须合理嵌套;
3.所有XML标记都区分大小写;
4.所有标记的属性必须用""括起来;
另外,XML标记必须遵循下面的命名规则:
1.名字中可以包含字母、数字以及其它字母;
2.名字不能以数字或"_" (下划线) 开头;
3.名字不能以字母 xml (或 XML 或 Xml ..) 开头;
4.名字中不能包含空格。

在XML文档中任何的差错,都会得到同一个结果:网页不能被显示。各浏览器开发商已经达成协议,对XML实行严格而挑剔的解析,任何细小的错误都会被报告。你可以将上面的myfile.xml修改一下,比如将《 email》改为《 Email》,然后用IE5直接打开myfile.xml,会得到一个出错信息页面.

如何通过读取XML配置文件导入Excel文件到数据中

1.首先,我们正常使用Excel的另存为,看看能否顺利地直接另存为XML文件。

方法:

点击Excel左上角按钮,在弹出的选项中,点击“另存为”

或者直接在Excel中按下快捷键F12

2.选择最后一项:其他格式。

3.接下来,重命名一下文件名,并选择文件类型为:

XML数据(*.xml)

4.点击“保存”按钮,会出现如下错误警告:

因为工作簿不包含任何XML映射,所以无法保存任何XML数据。

单击“帮助”以获取详细信息。

5.这个原因是我们的工作簿只是普通的Excel数据,的确没有做过XML映射,或者Excel数据也不是从XML文件导入的。

这时,我们尝试另存为另一种文件类型:

XML电子表格2003(*.xml)

6.点击保存按钮。

7.这时会弹出一个兼容性对话框,问你是否保持工作簿的这种格式。

8.点击“是”,即可将Excel保存为XML格式的文档了。

我们使用软件打开这个XML文档(例如通过Chrome浏览器),发现格式正常,Excel数据也全在里面。

XML的应用分析

杜富殿

(海南省国土环境资源信息中心,海口,570206)

摘要:数据交换存在于“金土工程”相关的系统、数据、上下级信息传递中,以 XML 作为基础的数据交换形式,可以解决数据交换的安全性、可靠性、灵活性和开放性,为“金土工程”提供简捷和高效率的数据交换方式。

关键词:“金土工程”;XML;数据交换;数据总线

“金土工程”是国土资源信息大厦的框架工程,数据将是该工程的核心内容之一,由于“金土工程”所牵涉的数据内容、数据类型和数据格式等方面的异构问题,数据交换必然是“金土工程”中不可或缺的组成部分。以 XML 为技术基础的数据总线方式,将为“金土工程”各系统、数据、上下级,甚至系统和数据内部的交换提供松散耦合、明码、界线明晰的可扩充性、易维护性、开放性和统一性的数据交换平台。

1 “金土工程” 的数据交换体系

“金土工程”将采用面向服务的技术构架及电子政务平台思想,强调技术的实用性、通用性、可靠性、安全性,保障系统的可扩充性、易维护性、开放性和统一性。

在数据资源建设方面,采用主流 GIS 平台、面向对象型数据库等技术,按照统一标准建设与整合各类数据库,通过集中与分布式管理相结合、多级备份和相对独立的数据管理机制实现数据的统一管理与维护。

在应用系统建设方面,统筹规划,通过电子政务平台搭建国土资源业务应用系统。

无论在数据资源和应用系统的内部或之间都必须进行数据交换,形成数据交换体系。数据交换体系包括面向基础数据库同步与备份的交换系统、面向各级业务信息传递的交换系统、面向外部数据共享的交换系统,甚至面向系统内部模块间的数据交换。

面向基础数据库同步与备份的交换系统,主要实现将下级数据库的更新及时地、自动地同步更新到上级数据库。

面向各级业务信息传递的交换系统,主要是用来实现垂直业务系统上下业务流程间的业务数据交换、统计数据上报、材料上报或下发等。

面向外部数据共享的交换系统,主要实现国土资源系统与外部门间基础数据有关业务数据的交换。

面向系统内部模块间的数据交换,主要实现模块之间数据计算、处理等过程中数据的交换。

数据交换体系必须解决数据交换的安全性、可靠性、灵活性和开放性,采用 XML 技术作为“金土工程”数据交换体系的基础是一种较佳的选择。

2 XML 的发展和特点

2.1 XML 的发展

到目前为止,采用 HTML 编写的 Web 页面占相当比例。HTML 简单易学又通用,句法简明紧凑,加上其扩充的表格、帧、脚本等功能,使得它在 Web 主页上大显身手。但是随着 Web 应用的越来越广泛,HTML 过于简单的弱点也越来越明显了。

(1)链路丢失后不能自动纠正 由于许多页面的 URL 地址经常变化,浏览这些页面时就会遇到烦人的404 URL 地址未找到的信息。不得不手工一个个地更改链接相关页面的 URL地址,这大大加重了 Web 页面的维护工作量。

(2)动态内容需要下载的部件太多 用 HTML 建立的页面目前还不能对其页面的外观属性,例如色彩、字体、背景等实现更新,只能重新下载一个新的页面或 Java 部件。但 Java保存的数据搜索引擎是无法访问的,所以在 HTML 页面中使用 Java 来显示动态内容也不是灵丹妙药。

(3)搜索时间长 由于 HTML 页面没有类似于数据库的结构,在这样的文档资料中搜索目标时需要对全部页面的所有内容扫描,往往检索出一大堆与主题词无关的内容,这是因为HTML 无法区分信息与元信息而造成的。而且 HTML 不支持信息嵌套体系结构,因而限制了全文检索功能。

(4) HTML 缺乏对双字节或多国文字的支持,或者说支持不够。例如中文信息页面在不同的平台下会出现格式不齐等问题。

(5)HTML 可扩展性差 科学家无法用 HTML 书写数学公式、化学方程式以及分子晶体结构。

为解决这些缺点,可扩展标记语言——Extensible Markup Language,简称XML应运而生。

1998年2月万维网协会(W3C)发布了XML1.0 标准,XML是一种元标注语言,该语言提供一种描述结构数据的格式,是W3 C 定义的用于优化Web 上的传输的**ML (通用标记语言标准 ISO8879:1986)的子集,XML 确保结构数据是一致的并独立于应用程序或供应商,可编码各种情况(从简单至复杂)的内容,是语义和架构的数据标准。

2.2 XML 的特点

XML 自从出现以来,以其标准化、接口协议、简化和封装等优点,被誉为信息标准化过程的有力工具,基于 XML 的标准将成为以后信息标准的主流。

2.2.1 标准化

与其他服务技术相比,标准化是 XML 特色之一。XML 提供了系统之间传输数据的标准格式。万维网联盟(W3C)管理 XML 标准并发布给全球的 XML 技术提供者,这就确保了 XML 产品的兼容性。除了 XML 引擎和产品外还有 XML 文法(grammar)。每一个XML语法都是一种在某个特定问题领域进行数据格式化的标准方法,遵循并采用 XML 文法,任何人都可以使两个应用系统间通信的数据格式标准化。

2.2.2 接口协议

在对接口进行编程时经常将它称之为协议。从编程的角度出发,接口在没有暴露实现的情况下提供了编程结构。如果使用 DTD (文件类型定义)和大纲(schema),那么XML 就有类似的特性。DTD 和大纲都用来描述 XML 文档的结构以及 XML 文档的建立规则,可以用一个(或者多个)相关 DTD (或者大纲)组织这样的规则集合,称之为 XML文法。

XML 文法不仅可以用于应用程序之间通信的标准化,还可以为开发者提供一个接口协议。换句话说,开发者在创建一个需要使用 XML 文档结构的应用程序时,不需要知道文档是如何实现的(即实际的 XML 文档)。DTD 以及大纲描述了文档的结构,可以作为开发的接口协议,对 DTD 的任何改动同时也改变了协议。

2.2.3 简化

XML 文档的另一个重要方面就是它的简化特性,而是说 XML 的概念和一般方法简单。例如,XML 是基于文本文档的,这就简化了打开 XML文档并查看其内容的过程。

用 XML 简化 Web 服务模型很方便,这一点也很重要。Web 服务天然就比单独的XML要复杂。假设 XML和CORBA同样复杂,而且其他Web服务技术的复杂度相同,那么Web服务技术就会变得非常笨重。但是通过使用简单的搭积木的方法,如XML、SOAP等等,可以控制 Web 服务的复杂度在一个可以容忍的范围之内,这样用它创建的应用程序不至于难以控制。

2.2.4 封装

封装是XML特性之一,在开发Web服务的时候尤其如此。从本质上来说,封装指的是获得一个或者多个数据块(chunks of data)并把它们集合成一个简单对象(而不是几个独立对象)的概念。封装与集合(aggregation)类似,但是它们之间有一个重要的差别,即封装一般意味着它没有外部依赖性。

可以创建带有外部依赖性的 XML 文档,但是在事务 Web 服务模型(transactional Webservices model)中,利用封装会显得更加明智。通过设计包装了依赖性的 XML 解决方案,一般都可以消除事务处理过程中的问题。尤其是在外部数据常常发生变动的情况下,强迫在事务处理中定位外部数据并使其与 XML 数据一致的方法是有害的。如果把数据封装到XML文法中去,就交易获得正确的数据。

3 XML 数据总线应用分析

3.1 XML 为 “金土工程” 的数据交换搭建总线

“金土工程”的各系统和层次之间的数据交换通过开放的 XML 数据总线技术实现,XML数据总线由四部分的内容组成:发布、集成、分布和自动化,如下图所示。

XML 数据总线图

发布数据总线是将同一数据内容在客户端根据不同的用户需求进行不同形式展现的数据交换。通过数据总线方式将数据显示与内容分开,XML 定义的数据允许指定不同的显示方式,使数据更合理地表现出来。XML 补充了 HTML,逐渐被广泛地用来描述用户界面,形成了 HTML 描述数据的外观,而 XML 描述数据本身。

本地的数据能够以客户配置、使用者选择或其他标准决定的方式动态地表现出来,CSS和 XSL 为数据的显示提供了公布的机制。通过 XML,数据可以粒状地更新。每当一部分数据变化后,不需要重发整个结构化的数据。变化的元素必须从服务器发送给客户,变化的数据不需要刷新整个使用者的界面就能够显示出来。改变了 HTML 方式,只要一条数据变化了,整一页都必须重建,这严重限制了服务器的性能。

另外,通过 XML 总线方式发布的数据还允许加进其他数据,加入的数据能够进入存在的页面,不需要浏览器重新发一个新的页面。

集成数据总线是系统之间的两个或更多异质数据库之间进行数据交换。

系统之间与这些有各自不同的复杂格式的数据库间通过 XML 标准语言进行交互,这是由于 XML 的自定义性及可扩展性,使其足以表达各种类型的数据。系统收到数据后可以进行处理,也可以在不同数据库间进行传递。XML 解决了数据交换的统一接口问题。

XML 给系统赋予了强大的功能和灵活性。比如进行更有意义的搜索,并且数据被XML 唯一地标识。没有 XML,搜索工具必须了解每个数据库是如何构建的,但这实际上是不可能的,因为每个数据库描述数据的格式几乎都是不同的。由于不同来源数据的集成问题的存在,现在搜索多样的不兼容的数据库实际上是不可能的。通过 XML 数据总线的方式能够使不同来源的结构化的数据很容易地集成在一起,可以在中间层的服务器上对从后端数据库和其他系统来的数据进行集成,然后,数据就能被发送到客户或其他服务器做进一步的集合、处理和分发,达到数据库之间的数据交换。

分布数据是通过数据总线方式将大部分处理负载从服务器发布转到客户端的数据交换方式。

客户可根据自己的需求选择和制作不同的应用系统以处理数据,而服务器只需发出同一个XML文件。如按传统的“Client/Server”工作方式,客户向服务器发出不同的请求,服务器分别予以响应,这不仅加重了服务器本身的负荷,而且网络管理者还须事先调查各种不同的用户需求以做出相应不同的程序,但假如用户的需求繁杂而多变,则仍然将所有业务逻辑集中在服务器端是不合适的,因为服务器端的服务系统可能来不及满足众多的应用需求,也来不及跟上需求的变化,双方都很被动。应用 XML 数据总线的方式则将处理数据的主动权交给了客户,服务器所作的只是尽可能完善、准确地将数据封装进 XML 文件通过总线方式进行交换,形成各取所需、各司其职。利用了 XML 的自解释性使客户端在收到数据的同时也理解数据的逻辑结构与含义,从而扩展了广泛、通用的分布式计算方式。

自动化数据总线是遵循共同的数据交换标准,使得应用程序具有一定的自动处理能力,以便实现对所取得的信息进行、增减以适应用户的需要,从而提高工作效率的方式。开发一个典型的国土资源管理应用智能代理程序的步骤如下:①该程序向下一级国土资源管理部门的数据交换系统发出一个数据更新的请求,在得到应答后,自动连接答复中提供的所有所在级国土资源部门的站点;②搜索预定数据的信息,并对获取到的不同站点针对该内容的信息按一定的规则进行比较;③得出所需要的结果,并自动向所在站点的国土资源管理部门发数据更新的通知。

3.2 XML 数据总线的特点

3.2.1 数据交换的安全性

在数据交换中心的设计中采用了 XML 文档作为数据交换的媒体。对于文档的加密现在有非常成熟的方法,所以可对 XML 文档整篇加密,并经过数字签名认证后安全地发送给一个或多个接收方,数据接收方接收到 XML 数据文档后经过解密即可使用。

3.2.2 系统的可靠性

在数据交换中心的设计方案中,考虑整个数据交换中心作为一个独立的应用服务组件存在于国土资源管理部门的信息系统环境中,而不依赖于任何独立的信息系统,则系统不会受到信息系统意外崩溃的影响。

交换中心与数据库脱离,即在正常情况下数据交换中心不与任何信息系统或其他专业系统的数据库进行互操作,所有的数据处理都经由数据的拥有者和请求者进行处理。这种设计方式既保证了各系统的独立性和安全性,又保证了系统之间的交互性。

数据交换中心存在于应用服务器环境中,可以利用应用服务器环境提供的动态负载均衡和失败恢复功能,保证数据交换中心长期可靠的运行。

3.2.3 系统的灵活性

数据交换中心提供基于消息的数据交换方式和由数据交换中心直接进行数据读写两种数据交换方式,以适应各种系统环境。

基于消息的数据交换方式是数据交换中心的首选方式,在该方式下数据交换中心与支持消息机制方式的系统进行异步数据交换。数据交换的发起方向数据交换中心提交 XML形式的消息后继续执行其他任务,直到从数据交换中心收到数据交换完成的消息后,再对要求的数据进行处理。在基于消息的数据交换方式下,数据交换中心对消息进行全程管理,保证消息的接收顺序及数据的正确性。

数据交换中心还提供由数据交换中心直接进行数据读取的数据交换方式,在此方式下,数据交换中心主要与被动提供数据的系统进行交互,那些系统只需要提供数据而不会要求数据,同时系统的构成相对简单。

3.2.4 系统的开放性

数据交换中心对外提供消息控制 API 和数据转换协议定制工具,使得任何系统只要通过数据转换协议定制工具往数据交换中心中添加数据转换协议,就可以使用数据交换中心提供的消息控制 API 与数据交换中心进行数据交换。

由于 XML 标准具有可扩展性,并且有很强的自描述功能改进了传统的数据表示方法,不仅非常适于数据交换与信息发布,而且将日益成为显示、索引等的基础。现在的数据库基本都已提供了 XML 转换工具,因此 XML 文档非常适合用作跨系统、跨平台的“金土工程”中数据交换,随着 XML 作为在交换数据的一种标准方式的出现,基于 XML基础的应用将会更简捷和拥有更高的效率。

参考文献

[1]国土资源部.国土资厅发[2004]23 号关于印发《全国金土工程建设总体方案》的通知.2006

[2]Won Kim,Ki-Joon Chae.“Component-Based Knowledge Engineering Architecture.”JOOP,1999

[3]Ritter,D.The Missing Link for D2B E-Commerce.Intelligent Enterprise,1999

[4]高波,王琰,Ben Chang.Oracle,XML 开发手册,北京:机械工业出版社,2001

[5]XML 中国论坛.“XML 实用进阶教程”.北京:清华大学出版社,2001

[6]王仲,陈晓鸥.基于 XML 的数据交换与存取技术研究.计算机工程与应用,2001

[7 ]徐天昕,金烨,李柳玲.基于XML的对称式Web-EDI 系统的设计与实现,计算机集成制造系统-CIMS,2001

[8]何蓉,方旭明.基于 XML 的电子商务定单处理管道设计.计算机应用,2002

C#来创建和读取XML文档

  扩展标记语言XML(eXtensible Markup Language) 是由W C组织制定的 做为用于替代HTML语言的一种新型的标记语言 XML内部有着很多基本标准 XML就是通过与这些相关标准地结合 应用于科学计算 电子出版 多媒体制作和电子商务的 C#作为一种新型的程序语言 是 Net框架的一个重要组成部分 他和XML的关系颇深 本文就从一个方面来探讨一下这二者的关系 即 看用C#如何来创建和读取XML文档

  一.本文程序设计和运行的软件环境

  (一)微软公司视窗 服务器版

  (二) Net FrameWork SDK Beta

  二.C#创建XML文档

  在本文中我们来介绍一下用C#创建XML文档的二种方法 这二种方法各有千秋 第一种创建起来更灵活 第二种创建起来更方便

  (一)C#创建XML文档的第一种方法

  这一种方法是按照按照XML的结构一步一步的构建XML文档 C#构建XML文档通过 Net FrameWork SDK中的命名空间 System Xml 中封装的各种类来实现的 下面就按照一个XML典型文档结构来介绍一下

  ( )首先要创建一个空的XML文档

  在命名空间 System Xml 中有一个类 XmlDocument C#通过这个类来描述XML文档 下面是用C#创建一个XML文档

  xmldoc = new System Xml XmlDocument ( ) ; 

  ( )在XML的文档的最头部加入XML的声明段落

  利用 XmlDocument 类中的 CreateNode 方法可以创建一个指定类型的XML节点 CreateNode 方法的调用方法总共有三种 在本文中使用的是其一般的方法 具体语法如下

  XmlDocument CreateNode Method ( XmlNodeType String String )

  然后在利用 XmlDocument 类中的 AppendChild 方法在XML文档中加入此节点 用C#在XML文档中加入声明段落实现的语句如下

  xmlnode = xmldoc CreateNode ( XmlNodeType XmlDeclaration ) ;xmldoc AppendChild ( xmlnode ) ;

  ( )为XML文档加入元素(element)

  加入数据内容是通过元素 在 XmlDocument 类中提供了二个方法

   CreateElement 和 CreateTextNode 其中第一个方法是在XML中创建一个元素 另外一个方法是为创建的元素指定文本值 下面是为上面创建的XML文档加入一个根元素

  xmlelem = xmldoc CreateElement ( ROOT ) ;xmltext = xmldoc CreateTextNode ( Root Text ) ;

  注释 其中 xmlelem 是创建的 XmlElement 对象 xmltext 是 XmlText 对象有了创建一个XML元素的例子 就可以根据XML文档中数据的不同的结构来创建其他的数据了

  (二)C#创建XML文档的第一种方法的源程序代码(NO cs)

  using System ;using System Xml ;class MainClass{XmlDocument xmldoc ;XmlNode xmlnode ;XmlElement xmlelem ;XmlElement xmlelem ;XmlText xmltext ;static void Main ( string args ){MainClass app = new MainClass ( ) ;}public MainClass ( ){xmldoc = new XmlDocument ( ) ;//加入XML的声明段落xmlnode = xmldoc CreateNode ( XmlNodeType XmlDeclaration ) ;xmldoc AppendChild ( xmlnode ) ;//加入一个根元素xmlelem = xmldoc CreateElement ( ROOT ) ;xmltext = xmldoc CreateTextNode ( Root Text ) ;xmlelem AppendChild ( xmltext ) ;xmldoc AppendChild ( xmlelem ) ;//加入另外一个元素xmlelem = xmldoc CreateElement ( SampleElement ) ;xmlelem = xmldoc CreateElement ( SampleElement ) ;xmltext = xmldoc CreateTextNode ( The text of the sample element ) ;xmlelem AppendChild ( xmltext ) ;xmldoc ChildNodes Item( ) AppendChild ( xmlelem ) ;//保存创建好的XML文档try{xmldoc Save ( c:\\data xml ) ; }catch ( Exception e ){//显示错误信息C***ole WriteLine ( e Message ) ;}C***ole ReadLine ( ) ;}} 

  (三)C#创建XML文档的第二种方法

  在介绍完第一种方法以后 我想每一个读者都感觉到用C#创建XML文档是一项比较烦杂的工作了 因为不仅要了解创建的知识 还要了解文档的结构 这样创建的过程就是一步一步的了 下面就来介绍一种比较容易的创建方法 这种创建方法是直接定义XML文档 然后把他保存到文件中就可以了

  ( )创建一个XML文档

  这一点和第一种方法一样 在这里就不介绍了

  ( )通过 XmlDocument 类中的 LoadXml 方法 直接在文档中加入想要加入的XML数据 当然你加入的XML应该符合XML的语法 不然产生的文件也没有什么意义了 下面是加入XML的具体代码

  doc LoadXml ( + + Ma Jin Hu + + Feng Huang Street + Chu Zhou City + ANHUI + + + Wang Tian + + Lang Ya Street + He Fei City + ANHUI + + + Zou Wen Biao + + Sai Di Street + Bei Jin City + Bei Jin + + ) ; 

  ( )把保存XML文档到文件中

  保存XML文档是通过 XmlDocument 类中的 Save

  方法来实现的 具体如下

  doc Save ( data xml ) ; 

  (四)C#创建XML文档的第二种方法的源程序代码(NO cs)

  using System ;using System IO ;using System Xml;public class Sample{public static void Main ( ){//创建一个XmlDocument对象XmlDocument doc = new XmlDocument ( ) ;doc LoadXml ( + + Ma Jin Hu + + Feng Huang Street + Chu Zhou City + ANHUI + + + Wang Tian + + Lang Ya Street + He Fei City + ANHUI + + + Zou Wen Biao + + Sai Di Street + Bei Jin City + Bei Jin + + ) ;//保存这个文档到文件中doc Save ( data xml ) ;}} 

  用C#创建XML文档的方法其实有很多 在这里只是选取了二种比较典型的方法加以介绍 但无论那一种方法 C#在创建XML的时候都需要用到 Net FrameWork SDK 所以了解并掌握这个类库中的内容对于C#编程是十分必要的 在下面我们将来介绍一下用C#读取XML中的数据 通过这你会发现 C#又是利用这个类库实现这个功能的

  三.C#读取XML文件

  本节将用C#来读取本文中用第二种方法创建的XML文件 编译NO cs后 执行将产生 data xml 文件 其中 data xml 文件的数据结构如下

   Ma Jin Hu Feng Huang Street Chu Zhou City ANHUI Wang Tian Lang Ya Street He Fei City ANHUI Zou Wen Biao Sai Di Street Bei Jin City Bei Jin 

  在下面的内容中 我们利用C#读取此文件 并用ListView组件按照数据结构给显示出来

  要正确读取XML数据 首先要了解XML的结构 根据上面的XML文件 可以知道此XML包含三个数据 下面就来看如何读取这三条数据

  ( )装入XML文件 形成数据流

  通过创建一个 XmlDocument 对象 然后利用 load 方法 可以把XML文件装入 具体如下

  XmlDocument doc = new XmlDocument ( ) ;// 装入指定的XML文档doc Load ( C:\\data xml ) ; 

  ( )读取XML文件 并显示出来

  读取XML是通过创建 XmlNodeReader 对象来实现的 XmlNodeReader 对象主要是用来可以读取XML的节点数据 在本文的程序中使用到了一些 XmlNodeReader 的属性 譬如 NodeType 属性 用来判断读取得节点是什么类型 Value 是节点的值 下面是读取XML文件并显示在ListView中的实现代码 其中listview 是已经创建ListView组件

  while ( reader Read ( ) ) {//判断当前读取得节点类型switch ( reader NodeType ){case XmlNodeType Element :s = reader Name ;break ;case XmlNodeType Text :if ( s Equals ( Name ) )myItem = Listview Items Add ( reader Value ) ;elsemyItem SubItems Add ( reader Value ) ;break ;} } 

  四 C#读取XML的文件的源程序代码(read cs)

  在了解了上面的内容以后

  可以得到用C#读取指定XML文件的完整代码 具体如下

  using System ;using System Drawing ;using System Collecti*** ;using System ComponentModel ;using System Windows Forms ;using System Data ;using System Xml ;public class Form : Form{private Button button ;private ListView Listview ;private System ComponentModel Container ponents = null ;public Form ( ){//初始化窗体中的各个组件InitializeComponent ( ) ;}//清除程序中使用过的资源protected override void Dispose ( bool disposing ){if ( disposing ){if ( ponents != null ) {ponents Dispose ( ) ;}}base Dispose ( disposing ) ;}private void InitializeComponent ( ){button = new Button ( ) ;Listview = new ListView ( ) ;SuspendLayout ( ) ;button Anchor = ( ( AnchorStyles Bottom | AnchorStyles Left ) | AnchorStyles Right ) ;button Location = new Point ( ) ;button Name = button ;button Size = new Size ( ) ;button TabIndex = ;button Text = 读取XML文档 ;button Click += new System EventHandler ( button _Click ) ;Listview Anchor = ( ( ( AnchorStyles Top | AnchorStyles Bottom ) | AnchorStyles Left ) | AnchorStyles Right ) ;Listview GridLines = true ;Listview Location = new Point ( ) ;Listview Name = Listview ;Listview Size = new Size ( ) ;Listview TabIndex = ;Listview View = View Details ;this AutoScaleBaseSize = new Size ( ) ;this ClientSize = new Size ( ) ;this Controls Add ( Listview );this Controls Add ( button );this Name = Form ;this StartPosition = FormStartPosition CenterScreen ;this Text = 用C#来读取XML文档 ;this ResumeLayout ( false ) ;}static void Main ( ) {Application Run ( new Form ( ) ) ;}private void button _Click ( object sender System EventArgs e ){ListViewItem myItem = new ListViewItem ( ) ;// 构建listview组件Listview Columns Clear ( ) ; Listview Items Clear ( ) ;Listview Columns Add ( Name HorizontalAlignment Left ) ; Listview Columns Add ( Zip HorizontalAlignment Left ) ; Listview Columns Add ( Address HorizontalAlignment Left ) ; Listview Columns Add ( City HorizontalAlignment Left ) ; Listview Columns Add ( State HorizontalAlignment Left ) ; XmlNodeReader reader = null ;try{string s = ;XmlDocument doc = new XmlDocument ( ) ;// 装入指定的XML文档doc Load ( C:\\data xml ) ;// 设定XmlNodeReader对象来打开XML文件reader = new XmlNodeReader ( doc ) ;// 读取XML文件中的数据 并显示出来while ( reader Read ( ) ) {//判断当前读取得节点类型switch ( reader NodeType ){case XmlNodeType Element :s = reader Name ;break ;case XmlNodeType Text :if ( s Equals ( Name ) )myItem = Listview Items Add ( reader Value ) ;elsemyItem SubItems Add ( reader Value ) ;break ;} }}finally{//清除打开的数据流if ( reader != null )reader Close ( ) ;}}}   

  五.总结

lishixinzhi/Article/program/net/201311/12929

XML语言是什么,怎么用

XML是Extensible Markup Language的简写,一种扩展性标识语言。

这是标准的定义。那么什么是标志语言,为什么叫扩展性?已经让

人有些糊涂。我想我们这样来理解会好一些:

对HTML你已经非常熟悉了吧,它就是一种标记语言,记得它的全称吗:"Hypertext Markup Language" 超文本标记语言。明白了?同时,HTML里面有很多标签,类似,

等,都是在HTML4.0里规范和定义,而XML里允许你自己创建这样的标签,所以叫做可扩展性。

这里有几个容易混淆的概念要提醒大家:

1.XML并不是标记语言。它只是用来创造标记语言(比如HTML)的元语言。天,又糊涂了!不要紧,你只要知道这一点:XML和HTML是不一样的,它的用处途比HTML广泛得多,我们将在后面仔细介绍。

2.XML并不是HTML的替代产品。XML不是HTML的升级,它只是HTML的补充,为HTML扩展更多功能。我们仍将在较长的一段时间里继续使用HTML。(但值得注意的是HTML的升级版本XHTML的确正在向适应XML靠拢。)

3.不能用XML来直接写网页。即便是包含了XML数据,依然要转换成HTML格式才能在浏览器上显示。

下面就是一段XML示例文档(例1),用来表示本文的信息:
ajie

ajie@aolhoo.com

20010115

注意:

1.这段代码仅仅是代码,让你初步感性认识一下XML,并不能实现什么具体应用;

2.其中类似title,author的语句就是自己创建的标记(tags),它们和HTML标记不一样,例如这里的title是文章标题的意思,HTML里的title是页面标题。

简析Delphi中的XML编程

  XML(eXtensible Markup Language可扩展标志语言)在近几年的信息类杂志 网站上可谓是最抢眼的一词 大大小小的信息产品都争相和它搭上关系 唯恐赶不及这辆快车 有着良好口碑的宝蓝(Borland)系列开发平台也不例外 从 版开始就集成了XML组件包 因其使用MSXMLDom解析器 相比于此前广泛应用的XMLParser解析器 MSXMLDom更显规范 中文兼容性更好(元素名 属性名均支持中文) 很受开发者青睐 为帮助初学者快速掌握Delphi中的XML编程 笔者特写此文 以供交流

  笔者通过一个读写XML文件的实例来说明XML编程的各个步骤 只需读者有结点 元素 属性的基本概念就能容易的理解本文 笔者所要读入的XML文件结构如下所示 命名为Input xml

《学生花名册》

《学生 性别 = 男 》

《姓名》李华

《年龄》

《电话》

《学生 性别 = 男 》

《姓名》张三

《年龄》

《电话》

  Input xml文件的第一行是XML的版本说明 属性encoding宣告使用何种字符集建立 默认以Unicode 编码(UTF 或UTF ) 这里用中文GB 码 第二行 《学生花名册》 是根元素 下面定义了两个学生元素 学生下面嵌套了三个子元素 是对学生的进一步说明 与之相对应的 我们在Delphi中定义如下的学生数据结构 // 后面的文字是对变量或语句的说明 下同

TStudent = class {学生}

*** : string; //学生性别

name : string; //学生姓名

age : integer; //学生年龄

phone: string; //电话号码

end;

  为了读写 我们需要放置两个TXMLDocument控件 在Delphi VCL面板的Internet标签页里那个标有XML字样的控件就是 当然此控件也可以动态创建 但需要包含必要的文件 这里为简单起见 我们直接放置在窗体上 分别命名为InXMLDoc和OutXMLDoc InXMLDoc用于调入Input xml文件 OutXMLDoc用于暂存输出到Output xml的文档

  在窗体上放个按钮 我们把测试代码直接放置在按钮的单击事件里 先定义几个变量 用来保存临时信息 如下所示

Root : IXMLNode; //指向XML根结点

Parent_Node: IXMLNode; //指向学生结点

Child_node : IXMLNode; //指向学生的子结点

Student : TStudent; //存单个学生信息

List : TList; //存学生列表

i : integer; //循环变量

  我们先来读入XML文件 代码如下

List := TList Create; //初始化列表

InXMLDoc LoadFromFile( Input xml ); //调入Input xml文件

Root := InXMLDoc DocumentElement; //取XML文件的根结点 即 《学生花名册》

Parent_Node := Root ChildNodes First; //使Parent_Node指向学生结点

while (Parent_Node 《》 nil) do //循环取多个学生 可再多加几个学生信息测试

begin

if (Parent_Node NodeName = 学生 ) then //判断是否为学生结点

begin

Student := TStudent Create; //新建一个学生的结构信息

Student *** := Parent_Node Attributes; //取学生的性别属性

Child_Node := Parent_Node ChildNodes First;

//使Child_Node指向该学生的第一个子结点信息

while (Child_Node 《》 nil) do //循环取学生的各个子各点

begin

if (Child_Node NodeName = 姓名 ) then //判断是否为姓名结点

Student name := Child_Node Text //取姓名结点的值 取于name字段中

else if (Child_Node NodeName = 年龄 ) then //此行起后四行与前两行类似

Student age := StrToInt(Child_Node Text)

else if (Child_Node NodeName = 电话 ) then

Student phone := Child_Node Text;

Child_Node := Child_Node NextSibling; //顺序取下一个学生的子结点信息

end;

List Add(Student); //把一个学生信息加入列表

end;

Parent_Node := Parent_Node NextSibling; //顺序取下一个学生信息

end;

  到这儿 所有的学生信息都已存到List列表里面了 读者可以跟踪代码测试

  下面我们把List里的临时学生信息存到Output xml文件里 代码如下

OutXMLDoc Active := true; //激活OutXMLDoc 自动初始化空的XML文档

OutXMLDoc Encoding := GB ; //设置字符集

Root := OutXMLDoc AddChild( 学生花名册 ); //建根结点

for i := to List Count do //循环取各个学生信息

begin

Student := List Items; //顺序取一个学生信息

if (Student 《》 nil) then

begin

Parent_Node := Root AddChild( 学生 ); //根结点后添加一个学生结点

Parent_Node Attributes := Student ***; //给学生结点设置性别属性

Child_Node := Parent_Node AddChild( 姓名 ); //学生结点后添加一个姓名结点

Child_Node Text := Student name; //设置姓名的文本值

Child_Node := Parent_Node AddChild( 年龄 ); //此行起后四行与前两行类似

Child_Node Text := IntToStr(Student age);

Child_Node := Parent_Node AddChild( 电话 );

Child_Node Text := Student phone;

end;

end;

OutXMLDoc SaveToFile( Output xml ); //把组织好的XML文档存于Output xml文件中

OutXMLDoc Active := false; //钝化(关闭)OutXMLDoc

List Free; //最后释放保存临时学生信息的列表

lishixinzhi/Article/program/Delphi/201311/24984

如何利用Java语言进行XML编程

为了简化编写处理 XML 的 Java 程序,已经建立了多种编程接口。这些接口或者由公司定义,或者由标准体或用户组定义,以满足 XML 程序员的需要。本教程将讨论以下接口:
Document Object Model (DOM,文档对象模型),Level 2
Simple API for XML (SAX), Version 2.0
JDOM, Jason Hunter 和 Brett McLaughlin 创立的一种简单 Java API
Java API for XML Processing (JAXP)
这四种接口中前三个(DOM、SAX
和 JDOM)定义了如何访问与表示 XML 文档的内容。JAXP 包含创建解析器对象的类。要创建 DOM 或 SAX 解析器,您需要使用
JAXP。如果使用 JDOM,JDOM 库将在幕后使用 JAXP 为您创建一个解析器。总之:
使用 DOM、SAX 或 JDOM 处理 XML 文档的内容。
如果使用 DOM 或 SAX,则使用 JAXP 创建解析器。
如果使用 JDOM,则 JDOM 库为您创建解析器。
我将考察上述每种 API 的设计目标、长处和缺点,同时还涉及到一点它们的历史以及创建这些 API 的标准体。
关于例子
本教程中包含多个使用 DOM、SAX 和 JDOM API 的示例程序。所有这些程序都使用 XML 标记的莎士比亚十四行诗。十四行诗的结构如下:
《sonnet》
《author》
《lastName》
《firstName》
《nationality》
《yearOfBirth》
《yearOfDeath》
《/author》
《lines》

《/lines》
《/sonnet》
设置机器
在运行这些例子之前,需要对您的机器作一些设置。
(假设您知道如何编译和运行 Java 程序,并了解如何设置 CLASSPATH变量。)
***隐藏网址***
***隐藏网址***
解压从 Apache 下载的文件。根据解析器版本的不同,这样将会创建名为 xerces-2_5_0或者类似名称的目录。
所需要的 JAR 文件(xercesImpl.jar和xml-apis.jar)应该出现在 Xerces 根目录下。
***隐藏网址***
解压从 JDOM 下载的文件,这样将建立名为 jdom-b9或者类似名称的目录。
所需要的 JAR 文件(jdom.jar)应该在build目录中。
最后请下载本教程的示例压缩文件 ,并解压该文件。
把当前目录 (.)、xercesImpl.jar、xml-apis.jar和jdom.jar添加到CLASSPATH变量中。
基础
XML 解析器是读取 XML 文档并分析其结构的一段代码。这一部分将介绍 XML 解析器是如何工作的。
我将讨论不同类型的 XML 解析器以及何时使用它们。
本教程后面的章节将讨论如何创建解析器以及如何处理解析器给出的结果。
如何使用解析器
我将在后面的章节对此详细讨论,一般而言使用解析器需要以下步骤:
创建一个解析器对象
使解析器指向您的 XML 文档
处理结果
显然第三步最为复杂。一旦知道了 XML 文档的内容,比方说,您可能希望生成一个 Web 页面、创建一个订单或者做一个饼图。
考虑到 XML 文档所含数据的多样性,编写一个应用程序处理所有可能的输入是一项艰巨的任务。
所幸的是,这里讨论的常见 XML 解析工具使这项工作大大简化了。

如何在VC中使用XML

ML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini。VC++里操作XML有两个库可以用:MSXML和XmlLite。MSXML又细分了两种接口:DOM和SAX2。XP没自带有XmlLite,只自带有2.x、3.x版的MSXML,不支持SAX2(需要MSXML 4.0以上),所以优先使用DOM。
DOM是以COM形式提供的,VC++里调用DOM可以分3种方法:
1、MFC里用CComPtr调用
2、SDK里直接调用DOM接口
3、SDK里用智能指针调用
这3种方法本质上是一样的,区别只不过在于需要编码的多少而已,用CComPtr可以极大的简化代码,下面是几个例子。
例子stocks.xml:
《?xml version="1.0" encoding="utf-8"?》
《root》
《node1》text1《/node1》
《node2》
《childnode1 attrib1="value1" attrib2="value2"/》
《childnode2 attrib1="value1" attrib2="value2"》childtext1《/childnode2》
《/node2》
《/root》
这个例子应该包含了XML最常见的特征了吧?
MFC
MFC里可以直接使用DOM,不需要手动添加额外的头文件,只需要在CWinApp::InitInstance()里调用CoInitialize(NULL)初始化COM,在CWinApp::ExitInstance里调用CoUninitialize()释放COM就行了。
//读取XML
CComPtr《IXMLDOMDocument》 spDoc; //DOM
spDoc.CoCreateInstance(CLSID_DOMDocument);
VARIANT_BOOL vb;
spDoc-》load(CComVariant(OLESTR("stocks.xml")), &vb); //加载XML文件
CComPtr《IXMLDOMElement》 spRootEle;
spDoc-》get_documentElement(&spRootEle); //根节点
CComPtr《IXMLDOMNodeList》 spNodeList;
spRootEle-》get_childNodes(&spNodeList); //子节点列表
long nLen;
spNodeList-》get_length(&nLen); //子节点数
for (long i = 0; i != nLen; ++i) //遍历子节点
{
CComPtr《IXMLDOMNode》 spNode;
spNodeList-》get_item(i, &spNode);
ProcessNode(spNode); //节点处理函数
}
//写入XML
CComPtr《IXMLDOMNode》 spNode;
spRootEle-》selectSingleNode(OLESTR("/root/node1"), &spNode);
spNode-》put_text(OLESTR("newText")); //写入text
spRootEle-》selectSingleNode(OLESTR("/root/node2/childnode1/@attrib1"), &spNode);
spNode-》put_nodeValue(CComVariant(OLESTR("newValue"))); //写入value
CComPtr《IXMLDOMNode》 spNewNode;
spDoc-》createNode(CComVariant(NODE_ELEMENT), OLESTR("childnode3"), OLESTR(""), &spNewNode); //创建新节点
spRootEle-》selectSingleNode(OLESTR("/root/node2"), &spNode);
spNode-》appendChild(spNewNode, &spNewNode); //将新节点加为node2的子节点
spNewNode-》put_text(OLESTR("childtext2")); //写入新节点text
CComQIPtr《IXMLDOMElement》 spEle = spNewNode; //注意这里使用CComQIPtr
spEle-》setAttribute(OLESTR("attrib1"), CComVariant(OLESTR("value1")));//给新节点添加属性
spDoc-》save(CComVariant(OLESTR("stocks.xml")));
//节点处理函数
void ProcessNode(CComPtr《IXMLDOMNode》& spNode)
{
CComBSTR bsNodeName;
spNode-》get_nodeName(&bsNodeName); //节点名
AfxMessageBox(COLE2CT(bsNodeName));
CComVariant varVal;
spNode-》get_nodeValue(&varVal); //节点值
AfxMessageBox(COLE2CT(varVal.bstrVal));
DOMNodeType eNodeType;
spNode-》get_nodeType(&eNodeType);
if (eNodeType == NODE_ELEMENT) //只有NODE_ELEMENT类型才能包含有属性和子节点
{
//递归遍历节点属性
CComPtr《IXMLDOMNamedNodeMap》 spNameNodeMap;
spNode-》get_attributes(&spNameNodeMap);
long nLength;
spNameNodeMap-》get_length(&nLength);
for (long i = 0; i != nLength; ++i)
{
CComPtr《IXMLDOMNode》 spNodeAttrib; //注意属性也是一个IXMLDOMNode
spNameNodeMap-》get_item(i, &spNodeAttrib);
ProcessNode(spNodeAttrib);
}
//递归遍历子节点
CComPtr《IXMLDOMNodeList》 spNodeList;
spNode-》get_childNodes(&spNodeList);
spNodeList-》get_length(&nLength);
for (long i = 0; i != nLength; ++i)
{
CComPtr《IXMLDOMNode》 spChildNode;
spNodeList-》get_item(i, &spChildNode);
ProcessNode(spChildNode);
}
}
}
对于《tag》text《/tag》这样的节点,get_nodeValue会得到空,要得到"text"的话可以遍历子节点(只有一个子节点,它的nodeName为"#text",nodeType为NODE_TEXT,nodeValue就是"text");也可以用get_text直接得到"text",但是对于这样的节点《tag》text《childtag》childtext《/childtag》《/tag》,get_text会同时得到"text"和"childtext",不过这样的节点应该是不允许的。
DOM里使用的字符串(BSTR)都是OLESTR类型,默认情况下OLESTR是Unicode字符,MFC里可以用COLE2CT把LPCOLESTR转换为LPCTSTR。
对于自己定义的XML,大多数时候不需要遍历,可以通过调用selectNodes、selectSingleNode指定XPath直接读取某个节点或属性:
CComPtr《IXMLDOMDocument》 spDoc; //DOM
spDoc.CoCreateInstance(CLSID_DOMDocument);
VARIANT_BOOL vb;
spDoc-》load(CComVariant(OLESTR("stocks.xml")), &vb); //加载XML文件
CComPtr《IXMLDOMElement》 spRootEle;
spDoc-》get_documentElement(&spRootEle); //根节点
CComPtr《IXMLDOMNodeList》 spNodeList;
CComPtr《IXMLDOMNode》 spNode;
spRootEle-》selectNodes(OLESTR("/root/node2/*"), &spNodeList); //得到node2下的所有子节点
spRootEle-》selectSingleNode(OLESTR("/root/node2/childnode1/@attrib1"), &spNode); //得到childnode1的attrib1属性
XPath的语法可以参考XML文档或MSDN。
SDK
SDK中也可以使用智能指针,和MFC没太大区别,同样很方便,直接给代码:
#include 《iostream》
#include 《tchar.h》
#import 《msxml3.dll》
//节点处理函数
void ProcessNode(MSXML2::IXMLDOMNodePtr spNode)
{
std::cout 《《 "nodeName: " 《《 spNode-》nodeName;
if (spNode-》nodeType == NODE_ATTRIBUTE || spNode-》nodeType == NODE_TEXT)
std::cout 《《 "\tnodeValue: " 《《 _bstr_t(spNode-》nodeValue);
std::cout 《《 std::endl;
if (spNode-》nodeType == NODE_ELEMENT)
{
MSXML2::IXMLDOMNamedNodeMapPtr spNameNodeMap = spNode-》attributes;
for (long i = 0; i != spNameNodeMap-》length; ++i) //遍历节点属性
ProcessNode(spNameNodeMap-》item);
MSXML2::IXMLDOMNodeListPtr spNodeList = spNode-》childNodes;
for (long i = 0; i != spNodeList-》length; ++i) //遍历子节点
ProcessNode(spNodeList-》item);
}
}
int _tmain(int argc, _TCHAR* argv)
{
CoInitialize(NULL);
//读取XML
MSXML2::IXMLDOMDocumentPtr spXMLDoc;
spXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
spXMLDoc-》load(L"stocks.xml");
MSXML2::IXMLDOMElementPtr spRoot = spXMLDoc-》documentElement; //根节点
MSXML2::IXMLDOMNodeListPtr spNodeList = spRoot-》childNodes;
for (long i = 0; i != spNodeList-》length; ++i) //遍历子节点
ProcessNode(spNodeList-》item);
//写入XML
spRoot-》selectSingleNode(L"/root/node1")-》text = L"newText";
spRoot-》selectSingleNode(L"/root/node2/childnode1/@attrib1")-》nodeValue = L"newValue";
MSXML2::IXMLDOMNodePtr spNewNode = spRoot-》selectSingleNode(L"/root/node2")-》appendChild(
spXMLDoc-》createNode(_variant_t(NODE_ELEMENT), L"childnode3", L"")
); //给node2创建新子节点childnode3
spNewNode-》text = L"childtext2";
MSXML2::IXMLDOMElementPtr spEle = spNewNode;
spEle-》setAttribute(L"attrib1", _variant_t(L"value1")); //添加新属性
spXMLDoc-》save(_variant_t(L"stocks.xml"));
spNewNode.Release();
spEle.Release();
spNodeList.Release();
spRoot.Release();
spXMLDoc.Release();
CoUninitialize();
system("pause");
return 0;
}

使用PHP和AJAX的XML编程


在 SOA 架构中,程序员经常使用 XML 在应用程序之间交换结构化和半结构化的数据。XML 及其相关技术 — 文档对象模型(Document Object Model,DOM)、XPath、HTTP、XQuery 和可扩展样式表语言转换(Extensible Stylesheet Language Transformati***,XSLT) — 为快速应用程序开发提供了一个强大的环境。构建在这些技术之上的应用程序将占用更小的内存空间,需要更低的维护成本,同时又拥有更高的品质和灵活性。
DB2 和其他关系数据库的 XML 方面的特性已经相当成熟,因此除了存储和管理关系数据之外,它们还是存储和管理 XML 数据的理想选择。DB2 9 XML 支持(称为 pureXML)提供了以纯 XML 的形式(换句话说,就是带注释的、树型的分层存储)存储 XML 的能力。在 DB2 9 中,XML 数据可以用 XML 模式索引,可以从关系数据组合而成,可以分解为关系数据,可以查询和转换,可以独立发布,或者通过混合使用 **L/XML 和 XQuery 与关系数据组合起来。
Web 浏览器也正在为客户机脚本提供更多的功能来有效地处理 XML。通过使用异步 JavaScript 和 XML(Asynchronous JavaScript and XML,Ajax),Web 页面现在可以直接对应用服务器进行远程过程调用,并且可以在任何返回的 XML 数据上使用 DOM API。
本文将展示如何利用 DB2 XML、Ajax 和 PHP Hypertext Preprocessor (PHP) 提供的功能来编写简单的基于 XML 的应用程序。通过示例场景的帮助,您将学习如何在 JavaScript 中调用 PHP 应用程序;如何使用 DOM 和 SimpleXML API 修改 XML 数据;如何将 XML 从客户机传送到应用程序再到数据库;以及如何创建 PHP Web 服务来使用 **L/XML 和 XQuery 发布关于 XML 数据的报告。
XML 优点
大多数应用程序都用于创建、存储、操纵和呈现业务数据。对象包装是指将业务数据绑在一起,使业务逻辑更容易处理它们。这些包装器对象的很多功能都是根据关系和格式化规则来提供业务数据的结构,并使业务逻辑能够操纵、发布和串行化封装的数据。
·一个构造函数
·Getter 和 Setter 方法
·验证代码
·内部对象层次的串行化
这些对象与实际的业务逻辑没有关系。对象包装是为了使业务逻辑更容易管理业务数据。包装数据所需的代码比业务逻辑要多得多。更多的代码将导致更多的 bug、更大的固定性、更多的维护和更高的成本。
如果对象中的数据变量可以格式化为 XML 结构,并且对象的主要作用是将这些数据暴露给业务逻辑并让业务逻辑操纵它们,那么可以用 DOM 代替对象。
·创建新的 XML 对象。
·更新 XML 对象的值。
·导航 XML 对象。
·使用 XPath 在对象层次中搜索。
·串行化和反串行化 XML 对象层次(换句话说,就是内建持久性)。
通过使用 XML,可以避免使用大多数用于管理业务数据的包装器对象。应用程序将变得更加简洁,并且更多地将重点放在业务逻辑上,而不是数据管理上。
XML 和架构
将 XML 引入架构中可以为表示业务数据带来一种标准化的方式。XML 可以提供数据的结构;XML 模式施加结构和格式化规则;DOM API 和 XQuery、XPath 及 XSLT 之类的语言使业务逻辑可以有效地操纵、发布和串行化数据。由于业务数据的 XML 表示在客户机、中间层和数据库中都是一致的,因此操纵这些对象的代码也是类似的。
我将展示如何在三层环境中构建基于 XML 的应用程序,这个三层环境由以下几个部分组成:
·Web 客户机:Asynchronous JavaScript and XML (Ajax),DOM
·应用服务器:PHP 和 SimpleXML
·数据库: DB2 9 和 **L/XML,XQuery
基于 ACORD 人寿数据模型的场景
我们来考虑一个简单的人寿保险场景,在这个场景中,首先创建一个表示新保单的 XML 文档,然后查询和操纵这个文档,另外还将这个文档从一层移动到另一层。这个文档基于合作运营研究与发展协会(Association for Cooperative Operati*** Research
Development,ACORD)用于人寿保险规范的 XML,它定义了健康保险和年金保险需要交换的数据。
为了申请一个新的保险,客户需要提供一些基本信息。部分信息是在一个 PHP 应用程序中填写的,还有一部分是在客户机浏览器中填写的。然后,保单存储在一个 DB2 XML 列中。在 DB2 9 中,XML 类型的列在内部将 XML 数据存储为一棵解析后的树,与关系数据存储在不同的地方。这种方法是 DB2 9 特有的,更早的 DB2 版本则使用关系存储基础设施来存储 XML。
下面是保单 XML 文档在客户机与应用程序之间的流程:
·在 Web 客户机中,客户更新页面并单击 Submit。
·Web 客户机向 PHP 发出一个 XMLHTTP 请求,以获得新的空白保单文档。
·PHP 应用程序打开一个空白的保单文档,用一个全局惟一标识符(GUID)更新它,然后将该文档返回给 Web 客户机。
·Web 客户机使用 Ajax 捕捉返回的事件,并检索 XML DOM,然后用 Web 页面中输入的信息填充该文档。
·Web 客户机使用 XMLHTTP 将更新后的 XML 发送给 PHP 应用程序。
当第一个请求到达中间层的 PHP 应用服务器时,一个新的 XML 保单文档被装载到 SimpleXML 对象中。通过使用 SimpleXML API,用 PHP 应用程序中创建的 GUID 更新 TransRefGUID 元素。
header(’Content-type: text/xml’);
$fileContents = file_get_contents("$basedir/acord.xml");
$dom = ******xml_load_string($fileContents);
$dom-TXLifeRequest-TransRefGUID=$guid;
echo $dom-asXML();
然后,这个文档被发送到客户机。
对于本文,我们假设 GUID 是通过某种机制(例如时间和随机数的组合)创建的。更重要的是理解如何将表示保单的 XML 文档视作内存中的业务对象层次结构,以及如何使用 SimpleXML API (或 DOM/XPath)来导航和更新这个对象。
填充基本客户信息
在 Web 客户机中,fillPolicy() 函数读取返回的值。现在,包含返回 XML 的内存中表示的 DOM 对象可用于操纵保单文档。客户在 Web 页面上输入的信息被直接用于更新 DOM。当使用客户信息更新了保单之后,使用 XMLHTTP 将修改后的 DOM 对象提交回 PHP 应用程序(见清单 2)。即使是 HTML 组件值也是用 DHTMLDocument Object Model (DOM) 读取的。
#p#副标题#e#
将保单存储在 DB2 中
PHP 应用程序将传入的 XML 文档直接存储在数据库中,而不需要解析它(见清单 3)。DB2 的 pureXML 支持将隐式地解析传入的 XML,并将其存储在一个类 DOM 的分层结构中。现在,可以在 XQuery 语句中使用 XPath 之类的 XML 导航技术(就像在 DOM 中使用的那样)来查询 XML。DB2 9 还提供了在该层次结构中的任何节点上索引的能力。
公开 XML 文档上的服务
新的保单存储在 DB2 9 中以后,保险代理可以查询该保单,以决定是否接受这个保险。用于获得关于新保单报告的查询通过 Web 服务公开给客户机应用程序。
这个例子中的 Web 服务是用 PHP 编写的,它为调用实现服务的业务和转换逻辑的 DB2 存储过程提供了一个简洁的接口。每个 DB2 存储过程由一个 **L/XML 查询组成,它过滤和转换存储在数据库中的 XML 保单,以创建一个输出 XML 文档。然后,该 PHP Web 服务将 XML 文档返回给客户机。
我们来分析每个存储过程,看看那些有效地组成 Web 服务实现的查询。
列出所有新客户保险的 DB2 查询。包含该查询的存储过程是listAllNewCustomers(见清单 4)。该查询搜索 ACORD 表的 INFO 列中的所有保单文档。在每个 XML 文档中,DB2 进一步向下分析,以便只返回 PolicyStatus/@tc 属性的代码值被设为 12(也就是建议的值)的那些文档。查询输出是一个 XML 文档,它有一个根节点 newpolicylist,该节点包含一系列的用于每个新保单的 TXLife 子节点(见图 4)。
注意这个查询第一次如何使用 DB2 XQuery 函数 db2-fn:xmlcolumn 来导航关系模式,以定位到 XML 列 。当它到达 XML 列时,它进一步使用 XPath 在 XML 模式中导航到适当的节点(类似于使用 PHP、JavaScript 或其他语言导航 DOM)。
列出有风险客户的提议保险的 DB2 查询。该查询只列出有风险的新客户(也就是说,他们对于某个医疗问题的回答是 yes)。该查询包含在一个名为 listAtRiskNewCustomers 的存储过程中(见清单 5)。 注意:WHERE 子句同时检查答案和保单状态。
评估有风险新客户的风险度的 DB2 查询。对于以上列表中的每个保单,在保单的健康风险区域只能列出回答为 yes 的问题。该查询还返回 policytype,以显示该保单值多少钱,以便评估风险。包含该查询的存储过程(见清单 6)是 getRiskQuesti***(guid)。 注意:您需要一个支持 XML 类型的 DB2 驱动程序版本。否则,在每个存储过程中都需要使用 XMLSerialize 来从 XMLQuery 中串行化 XML 值。请参阅 developerWorks 文章 “结合使用 DB2 原生 XML 与 PHP” 以获得更详细的信息。
创建 Web 服务
用于 getnewpolicyinfo Web 服务的 PHP 代码是一个瘦包装器,它检查所需保单报告的类型,并调用适当的存储过程。然后,将存储过程所返回的值发送回客户机(见清单 7)。注意用 PHP 创建 Web 服务是多么简单。最后三行将该功能公开为一个 Web 服务。在任何客户机中,包括在 PHP 应用程序中,都可以调用 Web 服务,如清单 8 所示。
结束语
在过去几年中,各应用程序层的 XML 支持都已成熟,这导致一种强大的开发环境的出现,这种开发环境可以改变企业应用的设计方式。XML 使开发人员可以为业务文档定义规则和结构,还可以在内存中将文档实例化为分层对象,开发人员可以在任何层使用标准 API 对这种对象进行导航、修改和串行化。Ajax 使基于 Web 的客户机脚本可以调用 DOM API,还可以对中间层进行远程过程调用。PHP 为处理 XML 和 Web 服务提供了最简单的方法之一,因此非常适合基于 XML 的应用程序开发。XML 演变的最后一链是数据库层。DB2 9 使数据库层能操纵 XML。因此这个演变周期宣告结束。
#p#副标题#e#

关于xml编程与应用教程和什么是网页XML编程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
本文编辑:admin

更多文章:


菜单栏任务栏(电脑的菜单栏跑到上面去了,怎么移下来)

菜单栏任务栏(电脑的菜单栏跑到上面去了,怎么移下来)

大家好,关于菜单栏任务栏很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于电脑的菜单栏跑到上面去了,怎么移下来的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

xml编程与应用教程(什么是网页XML编程)

xml编程与应用教程(什么是网页XML编程)

本篇文章给大家谈谈xml编程与应用教程,以及什么是网页XML编程对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

python多线程处理多个文件(python读取大文件处理时使用多线程)

python多线程处理多个文件(python读取大文件处理时使用多线程)

大家好,关于python多线程处理多个文件很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于python读取大文件处理时使用多线程的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望

华为路由器ospf配置命令(华为网关配置命令)

华为路由器ospf配置命令(华为网关配置命令)

各位老铁们,大家好,今天由我来为大家分享华为路由器ospf配置命令,以及华为网关配置命令的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

手机shell怎么卸载(vivox5sl,每天耗电都特别快,这个shell是什么,怎么删大家知道吗)

手机shell怎么卸载(vivox5sl,每天耗电都特别快,这个shell是什么,怎么删大家知道吗)

其实手机shell怎么卸载的问题并不复杂,但是又很多的朋友都不太了解vivox5sl,每天耗电都特别快,这个shell是什么,怎么删大家知道吗,因此呢,今天小编就来为大家分享手机shell怎么卸载的一些知识,希望可以帮助到大家,下面我们一起

学编程入门先学什么(编程是什么 入门先学什么)

学编程入门先学什么(编程是什么 入门先学什么)

本篇文章给大家谈谈学编程入门先学什么,以及编程是什么 入门先学什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

strcmp在c++是什么意思(c++里这个代码什么意思(strcmp(ch,“y“)==0||strcmp(ch,“s“)==0);)

strcmp在c++是什么意思(c++里这个代码什么意思(strcmp(ch,“y“)==0||strcmp(ch,“s“)==0);)

这篇文章给大家聊聊关于strcmp在c++是什么意思,以及c++里这个代码什么意思(strcmp(ch,“y“)==0||strcmp(ch,“s“)==0);对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

教学软件都有哪些(教育一体机软件有哪些)

教学软件都有哪些(教育一体机软件有哪些)

各位老铁们好,相信很多人对教学软件都有哪些都不是特别的了解,因此呢,今天就来为大家分享下关于教学软件都有哪些以及教育一体机软件有哪些的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

要先安装jdk再配置环境变量么(如何配置jdk的环境变量)

要先安装jdk再配置环境变量么(如何配置jdk的环境变量)

大家好,今天小编来为大家解答以下的问题,关于要先安装jdk再配置环境变量么,如何配置jdk的环境变量这个很多人还不知道,现在让我们一起来看看吧!

正切函数性质(正切函数的性质有哪些)

正切函数性质(正切函数的性质有哪些)

本篇文章给大家谈谈正切函数性质,以及正切函数的性质有哪些对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

最近更新

佳能60d哪个好(佳能700d和60d哪个好)
2025-09-02 04:00:02 浏览:0
热门文章

口语100下载(口语100电脑版怎样下载)
2025-06-27 09:00:02 浏览:10
标签列表