具体实施方式
现在参考其中相似的数字代表相似的元素的附图,描述本发明的各种方面。具体地,图1和相应的讨论旨在提供对在其中可以实现本发明实施例的合适计算环境的简要描述。
一般而言,程序模块包括例程、程序、组件、数据结构和其它类型的结构,它们执行特定的任务或者实现特定的抽象数据类型。也可使用其它计算机系统配置,包括手持式设备、多处理器系统、基于微处理器或可编程消费电子产品、小型机、大型机等等。也可使用分布式计算环境,其中任务由通过通信网络链接的远程处理设备执行。在分布式计算环境中,程序模块可位于本地和远程两者的存储器存储设备中。
参见图1,用于实现本发明的一个示例性系统包括计算设备,诸如计算设备100。在一个非常基本的配置中,计算设备100通常包括至少一个处理单元102和系统存储器104。取决于计算设备的确切配置和类型,系统存储器104可以是易失性的(诸如RAM)、非易失性的(诸如ROM、闪存等)或是两者的某种组合。系统存储器104通常包括操作系统105、一个或多个应用程序104,并且可以包括程序数据107。在一个实施例中,应用程序106可以包括字处理程序120。这一基本配置在图1中由虚线108中的那些组件示出。
计算设备100也可具有其它特征或功能性。例如,计算设备100也可含有附加的数据存储设备(可移动和/或不可移动),诸如磁盘、光盘或磁带。这样的额外存储在图1中由可移动存储109和不可移动存储110示出。计算机存储介质可包括易失性和非易失性、可移动和不可移动介质,它们以用于存储诸如计算机可读指令、数据结构、程序模块或其它数据这样的信息的任意方法或技术来实现。系统存储器104、可移动存储109和不可移动存储110都是计算机存储介质的示例。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光存储、磁带盒、磁带、磁盘存储或其它磁性存储设备、或能用于存储所需信息且可以由计算设备100访问的任何其它介质。任何这样的计算机存储介质都可以是设备100的一部分。计算设备100也可以具有诸如键盘、鼠标、笔、语音输入设备、触摸输入设备等输入设备112。也可以包括诸如显示器、扬声器、打印机等的输出设备114。这些设备在本领域是公知的,因此不必在此详细讨论。
计算设备100也可以包含允许该系统与其它计算设备118诸如经网络通信的通信连接116。通信连接116是通信介质的一个示例。通信介质通常可具体化为诸如载波或其它传输机制等已调制数据信号中的计算机可读指令、数据结构、程序模块或其它数据,并且包括任何信息传递介质。术语已调制的数据信号是指以在该信号中编码信息的方式来设置或改变其一个或多个特性的信号。作为示例,而非限制,通信介质包括有线介质,诸如有线网络或直接线连接,以及无线介质,诸如声学、RF、红外线和其它无线介质。如此处所用的术语计算机可读介质既包括存储介质又包括通信介质。
可在计算设备100的系统存储器104中存储多个程序模块和数据文件,包括适于控制联网个人计算机操作的操作系统105,诸如来自华盛顿雷德蒙德的微软公司的Windows操作系统。系统存储器104也可存储一或多个程序模块,诸如字处理应用120以及下述的其它应用。字处理应用120用于提供创建、编辑和处理电子文档的功能性。
根据本发明的一个实施例,字处理应用120包括来自微软公司的WORD程序。然而应该了解,可利用来自其它制造者的字处理应用程序。字处理应用的例示仅为了示例,而非不限制可产生并操作文档的其它类型的应用。例如,可以等效地应用能处理各种形式内容(例如,文本、图像、图片等)的其它应用程序106,诸如电子表格应用程序,数据库应用程序,幻灯片演示应用程序,画图或计算机辅助应用程序等等。产生并操作各种不同类型文档的示例应用程序106包括来自微软公司的OFFICE。
实施例可实现为计算机过程、计算系统、或者制造品,如计算机程序产品或计算机可读介质。计算机程序产品可以是计算机系统可读且对指令的计算机程序进行编码以执行计算机过程的计算机存储介质。计算机程序产品也可以是计算系统可读的且对指令计算机程序进行编码以执行计算机过程的载波传播信号。
在通篇说明书和权利要求书中,下列术语采用与此处相关联的含义,除非该术语的上下文另有指示。
术语“数据”指文档表面层或者呈现层信息,诸如字词、语句、段落等等,以及由字处理文档携带、引用或使用的补充信息,例如元数据。该信息通常较大且有可能没有暴露于文档的呈现层。
术语“呈现”指文档的可见部分,诸如打印文档时会出现的文本和布局等。
术语“标签”指插入文档中描述XML文档内元素的字符。每个元素一般包括两个标签:开始标签和结束标签。也有可能具有空元素(没有内容),在此情形中允许一个标签。
术语“标记语言”或“ML”指用于文档内特殊代码的语言,用于规定文档的诸部分如何由应用程序来解释。在字处理文件中,标记语言规定文本被如何格式化或布局。
术语“元素”指XML文档的基本单元。元素可包含属性、其它元素、文本和用于XML文档的其它内容区域。
术语“构件”指文档中被绑定且有可能加有标签的区域,它用作用户输入的特定类型内容的容器。
术语“数据绑定,数据映射和数据域”指构件上的性质,它确定指向存储在文档中的XML DOM的XPath,其中应当存储该构件的内容。
在标签之间的XML内容被认为是该元素的“子”(或后代)。因此,嵌入在元素的内容中的其它元素称为“子元素”或“子节点”或者元素。直接嵌入在元素内容中的文本被认为是该元素的“子文本节点”。元素内的子元素与文本一起构成元素的“内容”。
术语“属性”指设置为特定值且与元素相关联的附加性质。元素可具有任意数量的与其相关联的属性设置,包括一个也没有。属性用于将附加信息与将不再包含其它元素或者作为文本节点来对待的元素相关联。
“XPath”是运算符,它使用模式表达式(pattern expression)来标识XML文档中的节点。XPath模式是用斜杠分开的子元素名称列表,它描述到通过XML文档的路径。模式“选择”匹配该路径的元素。
术语“XML数据存储或数据存储”指诸如字处理文档,电子表格文档,幻灯片演示文档等的文档内的容器,它在文件打开时提供对存储在该文档中的数据(例如XML格式)的存储和修改的访问。下面参考图2提供XML数据存储的进一步定义。
图2是例示一或多个客户应用程序与一或多个数据存储之间的关系以及数据存储中的内容的框图。一般而言,在将一或多个数据存储与文档内主呈现存储分开保存,以存储、关联并允许使用与计算机生成文档相关联的任意数据。用于结构化与文档相关联的信息的数据,诸如文档元数据,被保存在其中保存不同数据片之间的关系的一个数据存储中。数据存储向数据存储中的各种数据片暴露应用程序编程接口(API),以允许不同应用访问和操作一或多个数据片。如在此使用的,术语“数据消费者”、“应用”和“过程”能互换地使用,除非上下文另有明确指示。
数据片可按照标记语言如可扩展标记语言(XML)来结构化。XML模式可与每一数据片相关联,并且数据存储可基于与给定数据片相关联的XML模式来验证应用于数据的XML结构。数据存储可包含根据可扩展标记语言(XML)结构化的任何数量的任何数据项,例如元数据。因此,文档解决方案提供者可将任意元数据作为XML与给定文档存储在一起,并且让该信息在发生事件时由有权访问数据的给定解决方案来处理,诸如当数据从数据存储中移除或被加载到数据存储时和/或当用户打开/编辑/保存文档时。
当文档正在被编辑时,还可提供对XML形式的数据的程序性访问。根据一个实施例,提供一种解决方案开发者熟悉的标准机制,通过该机制在打开文档时能以在程序上访问和修改数据。该程序上的访问模拟标准的XML接口。通过应用编程接口为一或多个编辑客户应用(例如,文档编辑或创建应用和/或第三方应用插件解决方案等等)提供对数据的程序性访问。因此,多个客户应用可访问并编辑相同的文档数据片,并且解决任何对给定数据片的有冲突的改变。可对任何给定改变作出“副效应”(例如,响应于将公司名称设置为“Microsoft(微软)”,将股票代码改为“MSFT”)。此外,对数据的改变和任何相关联的副效应可由数据存储来“捆绑”,使得撤消一或多个改变将后退所有相关改变。这帮助减少对解决方案本身开发的负担,以确保当用户例如通过压下撤消命令从文档表面启动原始改变撤消时所有的改变都得以后退。
标准XML模式(XSD)也可用于定义与文档元数据相关联的任何定制XML数据片的内容,以确保应用于该文档数据的XML数据是有效的。这些模式可附连到存储在文档中的XML数据的任何实例中,并且数据存储将不允许会导致该数据的XML结构变成无效(即,XML标签与其内容相反)的任何对XML数据的改变。这帮助确保解决方案开发者能将特定的XML元数据片附连到文档,并且确保该XML数据将根据相关联的模式继续在结构上保持“正确”,无论哪个数据消费者(例如,插件)修改该数据。
现参考图2,文档数据220包括XML结构数据以及表示文档的表面或呈现层视图的相关联文档数据。例如,文档数据220可包括XML结构(例如,标题标签,正文标签,结论标签)以及字处理文档、电子表格文档、幻灯片演示文档等的相关联的表面视图数据(例如,字词,语句,段落)。
数据存储208是文档数据储存库,用于存储一或多个与关联于给定文档的一或多个类型的数据相关联的结构化数据片。尽管仅示出一个数据存储器,但可使用不止一个数据存储。元数据1225(结构化的数据项)可包括XML结构和用于关联于文档的第一元数据片的相关联数据。例如,元数据1225可包括XML结构数据(例如日期标签,名称标签等),它们列出文档作者,文档创建日期,文档最后改变/保存日期等等。元数据2230(结构化数据项)可包括XML结构数据(标签)以及表示关联于文档的第二元数据片的相关联元数据。如应了解的,元数据1和元数据2是为了示例,而非限制可保存在数据存储208中关联于给定文档的大量不同类型数据。例如,如在此所述的,任意数据可按有权访问文档数据的解决方案开发者或用户的需要,由一或多个软件应用来结构化并添加到文档。
模式文件240、245可选地可被附连到存储在数据存储208中的每一数据片,用于指示与应用于每一数据片225、230的可扩展标记语言(XML)相关联的句法和验证规则。XML模式文件提供一种在XML环境中描述和验证数据的方法。模式文件陈述使用什么XML标记数据(包括元素和属性)来描述XML文档中的内容,并且模式文件定义XML标记句法,包括每一元素所允许的位置,在元素内允许什么类型的内容以及在哪些元素可出现在其它元素中。模式文件的使用确保文档(或者在此情形中为单个的数据片)以一致且能预知的方式来结构化。模式文件240、245可由用户创建并且一般由相关联的标记语言诸如XML来支持。
该文档的模式化通过在数据存储层处拒绝违反给定模式文件的任何改变来允许数据存储提供“保证”文档的结构有效性的能力。按照一实施例,数据存储208使用模式验证模块260针对相关联的模式文件验证添加的XML结构或者对给定数据片的改变。例如,如果文档创建者或编辑者对给定数据片例如元数据1作出XML结构上的改变,其中编辑者添加或移除给定的XML标签,则数据存储208将使用模式验证模块针对相关联的模式文件来检查XML结构上的改变以确保改变的合法性。如果改变不是有效的,则向编辑者产生一个错误。如所理解的,对应用于给定数据片的XML结构的这种控制考虑了结构上的一致性和可预知性,这对于允许客户和第三方应用程序与相关联数据交互尤为重要。
数据存储208提供可由客户应用205(例如,字处理应用,电子表格应用,幻灯片演示应用等)以及第三方应用210、215通过相应应用205、210、210的对象模型(OM)访问的一或多个应用编程接口(API)270。这些API允许客户应用和第三方应用将任何现有XML文件加载到给定文档的数据存储208,因而确保该数据现在是文档的一部分并且将在其生存期中在该文档内传播(例如,通过打开/编辑/保存/重命名等)或者直到该数据从数据存储中删除为止。按照一个实施例,数据存储中的数据以其XML格式可用,甚至在给定数据片225、230的源应用被关闭或者不可用的情况下。即,给定数据片225、230可由其它应用(并非源应用)通过API 270来访问。如下所述,API还允许客户和第三方应用对应用于数据项225、230的XML标记数据进行改变。
一旦XML数据225、230被加载到数据存储中以便与文档220相关联,则可使用数据存储接口将其作为标准XML来操纵,其中数据存储接口被设计为提供与现有XML编辑接口相似的方法,以便利用开发者的XML编程标准的现有知识。这允许用户对添加到用于文档的数据存储的XML数据进行标准XML操作,诸如添加元素和属性,移除元素和属性,改变现有元素/属性的值,以及读取相关联XML树的任何现有部分的值。使用这些XML标准操作,解决方案可将结构化的复杂元数据与文档主题存储在一起而没有先前的对数据的长度/大小或数据的结构的限制,这使得对该XML数据存储的使用能够用于比以前的解决方案更显著地结构化的解决方案。例如,可编写第三方用215,它通过读取添加到每一文档的数据存储器208的元数据1225,而从多个文档定位和提取文档作者名称和文档创建日期。示例的第三方可以是一个为作出由给定组织创建的所有文档的文档作者名称和文档创建日期列表而编程的应用。按照本发明的实施例,第三方应用可使用应用于元数据1的XML结构来有效地定位和提取所需数据。例如,可编写第三方应用来语法分析元数据1文件的XML结构以定位XML标签,诸如<docauthor>和<doccreationdate>,用于获得和使用关联于这些标签的数据。如应了解的,上述内容仅是一或多个应用可通过数据存储208与关联于文档的结构化数据交互的许多方法中的一个示例。
此外,数据存储器208提供任意数量的API接口270给任何单独的XML数据片220、225、230(也称为存储项),以使多个应用205、210、215能够与同一数据片一起工作。例如,若干解决方案,诸如客户应用(例如字处理应用)和第三方应用解决方案(例如上述应用),可与同一组文档性质(例如包含在元数据2230文件中的性质)一起工作。使用数据存储208,这些应用的每一个通过其自己的数据存储API接口270接收对所需XML数据230的独立访问,这些API接口270允许每一个应用通过其自己OM与数据通信而不必处理让多个数据消费者访问同一数据片的复杂性。
为了允许这多个数据消费应用205、210、215访问同一数据,数据存储208在XML数据的任意部分被另一应用改变时通知这些应用的每一个,使得给定应用可响应于该改变(既包括在内部对于其自己过程的又包括在外部由对同一数据的其它改变所引起的)。当一个应用请求对给定数据项的改变时,该请求被自动发送到所有其它应用,以允许其它应用决定如何或是否响应所请求的改变。按照一个实施例,这是通过允许每一个应用注册对其具有接口的XML数据的任意部分的“监听”来实现的,使得给定的应用解决方案/程序仅接收属于其自己逻辑的那些消息。例如,一种类型的应用210可能希望注册监听对给定XML数据的所有改变以便向第三方解决方案提供详细的商务逻辑能力,而另一类型的应用215可能希望仅监听对同一数据内的一两个特定的XML元素的改变,因为其逻辑不关心对XML数据的任何其它部分的改变。
按照该实施例,多个应用205、210、215可访问和编辑同一文档数据片,并且解决对给定数据片的任何冲突改变。例如,当一个应用所作的一个改变引起由另一应用所作的“副效应”改变时,可对任何给定的改变作出副效应。例如,第一应用210的任务是从关联于给定文档的一或多个数据项225、230提取公司名称以将这些名称翻译成相应的股票代码,如果可用,则用来编译有关给定文档的公司股票代码的列表。如果第二应用215引起给定数据片中的给定公司名称添加或改变,例如将公司名称从“公司ABC”改变为“公司XYZ”,则第一应用可监听该改变,从而自动更新其股票代码列表以包括代替“公司ABC”的“公司XYZ”的股票代码。此外,这类改变及任何相关联的副效应可由数据存储208进行捆绑,使得撤消一或多个改变时后退所有相关改变。
图3例示示出的内部和外部数据消费者与XML数据存储之间交互的系统图。如所示的,系统300包括数据存储302,它包括呈现层304、XML存储1-N(306)(每一个包括错误存储和撤消存储)、全局改变存储308、可选全局撤消存储310、耦合到内部数据消费者1-N 314的内部代理程序312以及耦合到外部数据消费者1-N 318的外部代理程序316。
使用XML数据存储器306,文档具有包含任意数量的任意数据项的能力(只要每个数据项遵循标准的XML句法)。任意元数据可作为XML存储在文档内并且该信息在文档由用户打开/编辑/保存时可自动往返。
如上所述,当文档正在被编辑时通过可使用的API提供对该数据的程序性访问,提供一种解决方案开发者所熟悉的标准机制,通过该机制在文档打开时可程序性地访问和修改该信息。按照一个实施例,该程序性访问被设计为模拟标准的XML接口。使用API,当诸如字处理应用的应用正在运行时,可以添加/移除数据;可将数据填充到存储项(数据存储的一部分)内;使用标准的XML结构操纵数据;可将模式与数据存储中的任意XML数据相关联;一旦与数据存储项相关联,模式可被添加/移除/修改;以及可将XML改变作为事件发送给任何监听的客户。如所示的,API包括外部代理程序316和内部代理程序312,前者为外部数据消费者318而后者为任何内部数据消费者314提供与数据存储302交互的接口。
对数据存储302的操纵可实时发生。如上所述,数据存储306可包含一或多种类型的数据。例如,公司可能具有一个数据存储,这是他们正在用于存储他们想要存储在单一数据存储器内的所有不同类型的数据的数据存储,同时另一公司可能想要在不同数据存储内器存储不同类型的数据。
数据消费者318可注册涉及有关数据存储306的动作的事件。例如,数据消费者可注册以接收在对一或多个数据存储作出任何类型的改变时的事件。另一数据消费者可针对发生于数据存储内某一元素或某组元素的改变进行注册。公共事件包括,加载数据存储,添加到数据存储和从数据存储删除。当事件发生时,已经注册过的各数据消费者可对改变作出反应,同时保持数据存储器的状态一致。很多时候,数据消费者在作出改变时不执行任何动作。在其它时候,数据消费者会响应于事件而执行某(些)动作。例如,数据消费者可响应于改变而作出某些其它改变,诸如响应于题目改变而更新文档内的首部。数据消费者还可执行不影响文档的某些其它操作。例如,如果插入股票报价机代码,则数据消费者可检索关联于该股票代码的数据,即使所有检索到的数据并不显示在文档的呈现层内。数据消费者也可以拒绝该改变。例如,如果数据消费者1收到不接受的改变,则该数据消费者可向代理程序返回一个标志,表示不接受该改变。只要改变不被接受,则使得该改变连同任何副效应恢复原状(roll back),使得该改变从未发生过。每一XML存储306可使用其撤消存储来撤消其已作出的改变。作为替代,可使用全局撤消存储310来撤消在各数据存储上作出的改变。假设存在对发生于文档性质的事件感兴趣的三个数据消费者,因此这些数据消费者的每一个已经注册以接收有关这些性质改变的事件。当作出改变时,数据存储确定已经注册的每一数据消费者并且按预定的顺序将改变通知它们每一个。每一数据消费者进而可响应于该改变而执行某个动作。如果该改变以及由已注册数据消费者作出的、作为该改变的结果的任何改变不被任一数据消费者接受,则涉及该初始改变的所有改变被撤消。
外部代理程序应用编程接口层316提供由外部数据消费者318对数据存储302的访问并且允许第三方客户与数据存储器302交互,就象与关联于应用的内部数据消费者与数据存储器交互一样。为标识目的,为数据存储302内的每一XML数据存储306提供唯一的ID。这帮助定位XML数据存储306。
在任何时候,数据消费者可添加用于验证数据存储内数据的模式。因此,现在有任何其它第三方代码出现且尝试改变数据,数据存储器首先要做的是确定该改变对于所提供的模式是否有意义。一旦模式被附连,代理程序就变为验证中的对象。
数据存储一次还可接收一个以上元素。提供数据(XML)作为一个特定的流可帮助在一些情况下满足模式。例如假定,所附连的模式表示如果股票数据存在则必须至少具有两个公司。如果一个一个地添加股票数据则这将会是无效的。
使用单遍过程来验证数据。代替进行两遍会导致对数据存储作出改变的过程,在数据被提交给数据存储之前执行验证。这有助于防止数据消费者将错误引入数据存储。
图4和5例示处理涉及数据存储的事件的过程。当阅读对在此提供的例程的讨论时,应当了解,各种实施例的逻辑操作是作为(1)运行于计算机系统上的一系列计算机实现的动作或程序模块,以及/或者(2)计算机系统内互连的机器逻辑电路或电路模块来实现的。该实现是取决于实现本发明的计算机系统的性能要求来选择的。因此,所例示的并且构成在此所述的实施例的逻辑操作被不同地表示为操作、结构性设备、动作或模块。这些操作、结构性设备、动作和模块可用软件、固件、专用数字逻辑以及它们的任何组合来实现。
图4例示处理关联于数据存储器的事件的过程。一般而言,当数据存储从数据消费者收到改变请求时,该改变被发送到所有已注册数据消费者,以允许它们拒绝该改变或者请求副效应(其它XML改变)作为该改变的结果。
在开始操作之后,过程流至操作410,其中数据消费者注册其感兴趣接收的任何事件。这些事件可与添加数据到数据存储、从数据存储移除数据、对数据存储中的数据进行改变等等有关。事件可被附连到对存储在一或多个数据存储器内的元素进行的全局改变或者特定改变。例如,一个数据消费者可能想要知道任何改变作出的时间,而另一客户可能仅对数据存储内一特定值的改变感兴趣。
移动至判定操作420,作出事件是否已发生的判定。事件与对数据存储的改变有关。例如,如上所述,事件可包括添加、移除或对数据存储作出某种其它改变。例如,改变可以是添加一个节点到数据存储。当事件尚未发生时,过程返回到判定操作420。当事件已发生时,过程流至操作430。
在操作430,改变被中继给已注册该改变的每一数据消费者。按照一个实施例,以预定顺序通知每一数据消费者。例如,该顺序可基于数据存储进行注册的顺序。
转移至操作440,从已接收事件通知的每一数据消费者获得响应。每一客户可接受或拒绝该改变。这些响应该改变是否将被提交给数据存储。
移动至判定操作450,作出是否有任何数据消费者拒绝对数据存储的这一改变的判定。当该改变已由任何数据消费者拒绝时,过程移动至框460,其中响应于该改变作出的任何改变被恢复原状,好象改变甚至没有发生过一样。
当所有被通知的客户接受该改变时,过程流至操作470,其中可任选地验证这一改变,并且随后过程流至操作480,其中该改变被提交给合适的数据存储。
启动该改变的原始数据消费者随后接收该改变已被接受的通知(操作490)。过程随后移动至结束框,并且返回以处理其它动作。
图5例示处理包括副效应的事件的过程。一般而言,当数据存储从数据消费者接收改变请求时,该改变被发送到所有已注册客户,以允许它们拒绝该改变,或者请求副效应(其它XML改变)作为该改变的结果。例如,客户可被通知对数据存储内的一个项的改变,并且作为该改变的结果,数据消费者对数据存储作出另一改变。当请求作为副效应的改变时,则过程与图4所示的过程略有不同。
在开始操作之后,过程流至操作510,其中作为当前正被接受或拒绝的改变的结果,客户启动对数据存储的副效应改变。
转移至操作520,该副效应改变被排队但未被执行。换言之,该副效应改变没有立即在数据存储内执行。基于该事实,用于这些事件的替换方案包括:
强制节点操作(例如,添加,取代)以返回void而非节点和文档,它是一个请求而非动作 |
使节点操作的结果一致无性能击中对于如果你要操纵节点则你在其AfterAdd(添加后)事件中这么做的事实,清除经历 |
反映调用者正在‘请求’改变而非作出改变的事实 |
使节点操作的结果一致无性能击中 |
对每一调用者执行必要的改变,随后在调用者返回时撤消它们 |
向调用者返回活动节点 |
当在事件中作出改变时返回断开连接(读:尚未提交的节点) |
无论如何从改变返回节点 |
保存OM客户的独立DOM |
向调用者返回活动节点 |
移动至判定操作530,作出是否有任何数据消费者拒绝对数据存储器的原始改变的判定。
当该改变已经被任何数据消费者拒绝时,过程移动至框540,其中响应于该改变所作的任何改变和被排队的任何副效应改变被恢复原状,好象改变甚至没有发生过一样。
当客户已接受原始改变时,过程流至操作550,其中可任选地验证该改变,并且过程流至操作560,其中原始改变被提交给合适的数据存储。
过程随后移动至操作570,其中在数据存储内一次一个地执行副效应改变。每一副效应改变随后可被任何已注册客户接受或拒绝。当任何副效应改变被拒绝时,所作的所有改变被恢复原状,好象改变甚至没有被作出过一样。
过程随后移动至结束框,并且返回以处理其它动作。
下面是示例代码段,它们说明通过数据存储OM暴露的部分公共功能性:
第一示例说明将流添加到数据存储:
Dim oStream As CustomXMLPart
Set oStream=Document.XMLStreams.Add oStream.Load(″c:\sρecSolution.xml″)
第二示例说明定位数据存储。
Dim oStream As CustomXMLPart
Set oStream=Document.XMLStreams(″http://www.microsoft.com/office/12/specs″)
第三示例说明添加子树到数据存储。
oStream.SelectionNamespaces=oStream.SelectionNamespaces&″xmlns:s=′http://www.microsoft.com/office/12/specs′″
oStream.SelectSingleNode(″/s:spec/s:specBody/s:issues″).AppendSubtree(″<s:issue><s:issueBy/><s:issueDate/><s:issueDesc/x/s:issue>″)
按照一个实施例,下面是与API相关联的示例性函数。
CustomXMLNode上的事件
事件可CustomXMLNode(定制XML节点)上发生,也可仅在文档层上发生。
AfterInsert(NewNode as CustomXMLNode,InUndoRedo as Boolean)
参数:NewNode:对应于刚被添加至该CustomXMLNode的节点的CustomXMLNode对象。注意:该节点可具有子节点(如果子树刚被添加至文档)。InUndoRedo:Boolean(布尔型),如果节点是作为用户进行的撤消/重做动作一部分被添加的,则返回TRUE(真),否则返回FALSE(假)。
每当XML节点将被添加到当前文档时,该事件激发。如果添加操作涉及将一个XML文档的子树被添加至CustomXMLNode,为最顶端的节点改变激发该事件一次。为每一改变通过消息发送到数据存储,该事件激发一次,因此由该事件表示的改变的副效应也触发该事件。
AfterDelete(OldNode as CustomXMLNode,OldParentNode as CustomXMLNode,OldNextSibling As CustomXMLNode,InUndoRedo as Boolean)
参数:OldNode:对应于刚从CustomXMLPart移除的节点的CustomXMLNode对象。注意#1:该节点可以具有子节点(如果正在从文档移除子树)。注意#2:该节点将是‘断开连接’的节点,因为可从该节点进行向下查询,但不能向上——它看上去单独存在(即,它是一个具有相同OwnerStream的文档元素w/)。OldParentNode:对应于OldNode的以前父节点的CustomXMLNode对象。OldNextSibling:对应于OldNode的以前下一兄弟的CustomXMLNode对象。InUndoRedo:Boolean,如果该节点作为用户的撤消/重做动作一部分而被添加则返回TRUE,否则返回FALSE。
每当从数据存储中的当前项删除XML节点时,该事件激发。如果删除操作涉及CustomXMLPart中XML文档的子树,则为最顶端的节点的改变就激发该事件一次。为每一改变通过消息发送到数据存储,该事件激发一次,因此由该事件表示的改变的副效应也触发该事件。
AfterReplace(OldNode as CustomXMLNode,NewNode as CustomXMLNode,InUndoRedo as Boolean)
参数:OldNode:相应于刚从CustomXMLPart移除的节点的CustomXMLNode对象。注意#1:该节点可能具有子节点(如果正从文档中移除子树)。注意#2:该节点将是一个‘断开连接’的节点,因为可从该节点进行向下查询,但不能向上——它看上去是单独存在的(即,它是一个具有相同OwnerStream的文档元素w/)。NewNode:对应于刚添加到CustomXMLPart的节点的CustomXMLNode对象。注意:该节点可具有子节点(如果子树刚被添加到文档)。InUndoRedo:Boolean,如果该节点作为用户的撤消/重做动作一部分而被添加则返回TRUE,否则返回FALSE。
每当XML节点在数据存储中被代替时,该事件激发。如果替换操作涉及CustomXMLPart中XML文档的子树,则为最顶端的节点发生改变激发该事件一次。为每一改变通过消息发送到数据存储,则该事件激发一次,因此由该事件表示的改变的副效应也触发该事件。
CustomXMLParts():指向在包含OLE文档性质和WSS性质流的文件中所有可用的数据存储项的集合。
CustomXMLPrefixMappings:表示当前部分的所有前缀映射的对象。
AddNamespace(Prefix As String,NamespaceURI As String)As Void
参数:Prefx:String(串),表示添加到前缀映射列表的前缀。NamespaceURI:String,表示指派给新添加前缀的命名空间。
允许开发者添加定制命名空间/前缀映射以在查询该项时使用。如果前缀已经存在于管理器中,则除了在该前缀由数据存储在内部添加/使用的情况下,这会盖写该前缀的意义,随后将返回一个错误:“该前缀已经在使用并且不能被修改”。
Count As Long:返回集合中前缀映射的数量。
Item(Index as Long)As CustomXMLPrefixMapping
参数:Index:Long(长整型),表示集合中所需模式的索引。
从集合返回所请求的CustomXMLPrefixMapping。该对象的默认成员。
LookupNamespace(Prefix As String)As String
参数:Prefix:String,表示前缀映射列表中的前缀。允许开发者取得对应于指定前缀的命名空间。如果没有向所请求的前缀指派命名空间,则返回“”。
LookupPrefix(NamespaceURI As String)As String
参数:NamespaceURI:String,表示前缀映射列表中的命名空间。
允许开发者取得对应于指定命名空间的前缀。如果没有将前缀指派给所请求的命名空间,则返回“”。如果在命名空间管理器中存在多个指定的前缀,则返回符合所提供的命名空间的第一个前缀。
CustomXMLPrefixMapping:表示前缀映射的对象。
Prefix As String:返回该前缀映射的前缀。
NamespaceURI As String:返回该前缀映射的命名空间。
CustomXMLSchema:表示作为模式集合一部分的模式的对象。
Delete As Void:从模式集合删除该模式。如果这是对已经被验证或者被附连到流的集合(分类的活动集合)中的模式进行的,则失败,且错误消息为:“该模式不能被删除,因为模式集合当前正在使用”。
Location As String:返回一个串,它表示该模式在用户机器上的位置。
NamespaceURI As String:返回该模式的目标命名空间,如果XSD未指定则返回“”。
Reload As Void:从盘重新加载该模式,这翻译为修饰盘上该模式的拷贝:更新其位置(如果SL已改变)并且确保它仍是有效的模式。如果这是对已被验证或被系于流的集合(分类的活动集合)中的模式进行的,则失败,且错误消息为:“该模式不能被重新加载,因为模式集合当前正在使用”。
CustomXMLSchemaCollection():表示(可被/将被附连于流的)模式集合的对象。
Add([NamespaceURI As String],[Alias As String],[FileName As String],[InstallForAllUsers As Boolean=False])As CustomXMLSchema
参数:NamespaceURI:String,表示要添加到集合的模式的命名空间。如果该模式存在于模式库中,则从那里检索它。Alias:String,表示要添加到集合的模式的别名。如果该别名存在于SL中,使用该自变量来找到它。FileName:String,表示可以找到该模式在盘上的位置。如果该参数被指定,不仅将模式添加到集合,而且还将它添加到SL。InstallForAllUsers:Boolean,表示在将模式添加到模式库的情况下,SL键应当被写到HKLM(对于所有用户)还是HKCU(仅对于当前用户)。默认为False(写到HKCU)。
该方法允许开发者添加一或多个模式到模式集合,而该模式集合要被添加到数据存储中的流并被添加到模式库。可以和下列参数组一起调用它(在冲突的情形中,尝试按以下顺序使用这些参数):[NamespaceURI],[Alias],FileName,[InstallForAllUsers](如果对于该命名空间不存在模式,则将一个模式添加到模式库)。仅NamespaceURI(从模式库中查找XSD)。仅Alias(从模式库中查找XSD)。
AddCollection(SchemaCollection As CustomXMLSchemas())As Void
参数:SchemaCollection:表示要导入到当前集合中的模式集合的CustomXMLSchemas()对象。
添加已经存在的集合到当前集合。如果命名空间在导入期间发生冲突(例如,如果a.xsd已经链接到“fooNamespace”但引入的集合具有b.xsd用于同一命名空间),则引入的集合获胜。
Count As Long:返回集合中模式的数量。
Item(Index as Variant)As CustomXMLSchema
参数:Index:Variant(变体型),指示集合中所需的项。它可以是以下任一:String,表示所需模式的目标命名空间;或者Long,表示集合中所需模式的索引。
从集合返回所请求的CustomXMLSchema。该对象的默认成员。
NamespaceURI(Index as Long)As String
参数:Index:Long,表示集合中模式的索引。
返回模式集合中指定成员的目标命名空间。
Validate As Boolean:返回Boolean,表示集合中的模式是否被验证。这也是为集合中每一模式遍历Includes并且将它们添加到请求它们的模式的情况。
CustomXMLParts():表示一组CustomXMLPart对象的集合。
Add([XML As String],[SchemaCollection as CustomXMLSchemaCollection()])As CustomXMLPart
参数:XML:可选的String,表示添加到新创建的CustomXMLPart的XML。SchemaCollection:可选的CustomDataSchemaCollection()对象,表示用于验证该流的模式组。
允许用户添加新的CustomXMLPart到文件。如果XML参数中的XML不是合式(well-formed)的,则失败,并抛出错误:“要添加内容到该流,它必须是有效、合式的XML”。如果用户提供SchemaCollection:验证它(如果它尚未被验证过)。抛出被接收回OM客户的任何MSXML语法分析错误并且未能添加流。检查XML参数是否能被加载到DOM中。如果否,则失败并且抛出错误:“要添加内容到流,它必须是有效、合式的XML”。附连模式集合到DOM并且尝试验证实例文档。如果它没有证实,则失败并且抛出在OM客户接收回的XML语法分析错误并且不将流添加到集合。
如果用户不提供SchemaCollection:检查XML参数是否可被加载到DOM中。如果否,则失败并且抛出错误:“要添加内容到流,它必须是有效、合式的XML”。查看在XML文件中所引用的命名空间列表。从SL中找出这些模式并且推理出用于它们的模式集合。尝试验证所得到的模式集合。如果它没有证实,仍将流加到该集合,但它不与任何模式集合相关联并且因此没有被验证。将该模式集合附连到DOM并且尝试验证实例文档。如果它没有证实,则失败并且抛出接收回OM客户的XML语法分析错误,并且不将流添加该集合。如果它没有证实,仍将流添加到该集合,但它不与任何模式集合相关联并且因此没有被验证。提供空SchemaCollection将是一个用来表示“从不验证该流”的显式动作。
Count As Long:返回集合中定制数据流的数量。
Item(Index As Variant)As CustomXMLPart
参数:Index:Variant,可以是下列两种类型之一:Long,表示集合中所需CustomXMLPart的索引;或者String,表示集合中所需CustomXMLPart的根命名空间。如果不止一个CustomXMLPart符合这个根命名空间,则将按索引顺序返回第一个符合的CustomXMLPart。
这是CustomXMLParts对象的默认成员,并且它返回对应于所请求对象的CustomXMLPart对象。
SelectByID(ID As String)As CustomXMLPart
参数:ID:String,包含应从集合返回的数据存储项的ID。
允许开发者使用其ID从数据存储抓取特定项。如果具有此ID的存储项不存在,则返回Nothing(无)。
SelectByNamespace(NamespaceURI As String)As CustomXMLParts()
参数:NamespaceURI:String,表示来自数据存储的集合中的所需项的根命名空间。
返回其根命名空间匹配所请求条目的所有数据存储项。如果具有此根命名空间的流不存在,则返回空CustomXMLParts()集合。
StreamAfterAdd(NewStream As CustomXMLPart)
参数:NewStream:包含刚被添加的流的CustomXMLPart对象。
每当新的流被添加到数据存储时,该事件激发。如果添加多个流,则为每一新流该事件激发一次。如果(使用合适的.Add(添加)方法)将流与XML内容一起添加,则该事件应当直到该项被该内容填充才激发。
StreamBeforeDelete(OldStream As CustomXMLPart)
参数:OldStream:包含将要从数据存储删除的流的CustomXMLPart对象。
每当从数据存储移除流,该事件激发。如果移除多个流,则为每一被删除的流该事件激发一次。还将该流标记为‘将要被删除’,使得对它的只读操作是合法的(例如,查询节点、检查值等),但写操作失败,且错误信息为“该操作不能在将要被删除的流上完成”。
CustomXMLPart:Object(对象),表示数据存储中单个XML流。
AddNode([Name As String],[NamespaceURI As String],Parent AsCustomXMLNode,[NextSibling As CustomXMLNode],[NodeType AsmsoCustomXMLNodeType],[Node Value As String])As Void
参数:Name:String,表示要被添加到XML DOM的节点的基本名称。Namespace:可选的String,表示要被添加到XML DOM的节点的命名空间。添加msoCustomXMLNodeElement或msoCustomXMLNodeAttribute类型的节点时需要,否则忽略。Parent:CustomXMLPart,表示该节点应当被添加至其下的节点。如果添加属性,表示应当向其添加属性的元素。NextSibling:可选的CustomXMLNode,表示应当变成新节点的下一兄弟节点的节点。如果未指定,则该节点被添加到父节点的子节点末尾。忽略有关添加msoCustomXMLNodeAttribute类型。如果NextSibling不是某个父节点的子节点,返回错误:“该节点不能被添加,因为下一兄弟节点不是父节点的子节点”。NodeType:可选的msoCustomXMLNodeType,指定要创建的节点类型。如果未指定,则假设为msoCustomXMLNodeElement。NodeValue:可选的String,用于设置允许文本的节点的节点值。如果该节点不允许文本,则忽略该参数。
用于添加XML节点到数据存储项的普适方法。需要Parent并且NodeType默认为msoCustomXMLNodeElement。如果得到的添加在结构上是无效的,则失败,且错误消息为“该操作不能完成,因为它导致在结构上无效的数据流”。如果命名空间不在模式引用集合中,则失败并且提供错误消息:“要添加该元素,首先必须附连其模式至数据流”。
DocumentElement As CustomXMLNode
取流的根元素。如果流为空,则返回Nothing。
Delete As Void:从数据存储中删除当前CustomXMLPart。如果用户试图删除核心性质部分,则失败,且错误消息为:“该定制XML部分为办公室正确运行所需的因而不能删除”。
ID As String:返回一个串,包含指派给当前CustomXMLPart的GUID。
Load(FilePath As String)As Boolean
参数:FilePath:String对象,对应于在用户机器(或网络等)上的、应从其中加载用于该CustomXMLPart的XML的文件。
允许模板作者从先前存在于其机器上的文件填充CustomXMLPart。如果加载成功,则返回TRUE,如果否则FALSE(包括启动结构强制并且XML在结构上非法的情形或者XML不是有效和/或合式的情形)。一旦加载DOM,则失败,且错误消息为“该DOM不能加载两次”。
LoadXML(XML As String)As Boolean
参数:XML:String对象,对应于应当与该CustomXMLPart一起加载的XML。
允许模板作者从XML串来填充CustomXMLPart。如果加载成功则返回TRUE,否则返回FALSE(包括启用结构性强制并且XML在结构上非法的情形或者XML不是有效和/或合式的情形)。一旦加载DOM,则失败,错误消息为“该DOM不能加载两次”。
NamespaceURI As String:返回一个串,包含当前CustomXMLPart的根节点的完整命名空间URI。如果流为空(创建但未添加节点),则返回“”。
SchemaCollection As CustornXMLSchemaCollection():取/设置CustomXMLSchemaCollection()集合,表示附连到该流的模式组。如果用户提供SchemaCollection,则验证它(如果它尚未验证过)。抛出接收回客户的任何语法分析错误并且未能添加流;以及将模式集合附连到DOM并且尝试验证实例文档。如果它没有证实,则失败并且抛出在客户处接收回的语法分析错误,并且不改变流上的模式集合。
NamespaceManager As CustomXMLPrefixMappings()
取得针对当前CustomXMLPart使用的命名空间前缀映射组。当打开文档时,自动用嵌入在数据存储项中的前缀映射的内容来填充它,但可以由模板作者编辑/添加/删除它。然而,按照一个实施例,对该参数的改变不与文档一起保存。
SelectNodes(XPath As String)As CustomXMLNodes()
参数:XPath:String,包含针对DOM求值的XPath表达式。该XPath的前缀映射是从相关联的命名空间管理器检索的。如果XPath没有解析,则传递通过任何发生错误的地方。
该方法允许开发者从DOM内取回一组节点。
SelectSingleNode(XPath As String)As CustomXMLNode
参数:XPath:String,包含针对DOM求值的XPath表达式。该XPath的前缀映射是从相关联的命名空间管理器检索的。如果XPath没有解析,则传递通过任何发生错误的地方。
该方法允许开发者从DOM内取回单个节点。
XML As String:返回当前CustomXMLPart的XML表示。
NodeAfterInsert(NewNode as CustomXMLNode,InUndoRedo as Boolean)
参数:NewNode:CustomXMLNode对象,对应于刚被添加到CustomXMLPart的节点。注意:该节点可能有子节点(如果子树刚被添加到文档)。InUndoRedo:Boolean,如果节点是作为用户的撤消/重做动作的一部分被添加的,则返回TRUE,否则FALSE。
每当XML节点将要被添加到当前文档,该事件激发。如果添加操作涉及要添加到CustomXMLPart中的XML文档子树,则为最顶端节点的改变,就激发该事件一次。为通过消息发送到数据存储的每一改变,该事件激发一次,因此由该事件表示的改变的副效应也触发该事件。
NodeAfterDelete(OldNode as CustomXMLNode,OldParentNode asCustomXMLNode,OldNextSibling As CustomXMLNode,InUndoRedo as Boolean).
参数:OldNode:CustomXMLNode对象,对应于刚从CustomXMLPart移除的节点。注意#1:该节点可能有子节点(如果子树正从文档移除)。注意#2:该节点将是一个‘断开连接’的节点,因为可从该节点进行向下查询,但不能向上——它看上去是单独存在的(即,它是一个具有相同OwnerStream的文档元素w/)。OldParentNode:CustomXMLNode对象,对应于OldNode以前的父节点。OldNextSibling:CustomXMLNode对象,对应于OldNode以前的下一兄弟节点。InUndoRedo:Boolean,如果该节点作为用户的撤消/重做动作一部分而被添加则返回TRUE,否则返回FALSE。
每当从数据存储的当前项中删除XML节点时,该事件激发。如果删除操作涉及CustomXMLPart中的XML文档子树,则为最顶端的节点发生改变就激发该事件一次。为通过消息发送到数据存储的每一改变,该事件激发一次,因此由该事件表示的改变的副效应也触发该事件。
NodeAfterReplace(OldNode as CustomXMLNode,NewNode asCustomXMLNode,InUndoRedo as Boolean)
参数:OldNode:CustomXMLNode对象,相应于刚从CustomXMLPart移除的节点。注意#1:该节点可能具有子节点(如果正从文档移除子树)。注意#2:该节点将是一个‘断开连接’的节点,因为可从该节点进行向下查询,但不能向上——它显示器是单独存在的(即,它是一个具有相同OwnerStream的文档元素w/)。NewNode:CustomXMLNode对象,对应于刚添加到CustomXMLPart的节点。注意:该节点可具有子节点(如果子树刚被添加到文档)。InUndoRedo:Boolean,如果该节点作为用户的撤消/重做动作一部分而被添加则返回TRUE,否则返回FALSE。
每当XML节点在数据存储中被代替时,该事件激发。如果替换操作涉及CustomXMLPart中的XML文档子树,则为最顶端的节点发生改变就激发该事件一次。为通过消息发送到数据存储的每一改变,该事件激发一次,因此由该事件表示的改变的副效应也触发该事件。
CustomXMLNodes():表示当前文档中一组CustomXMLNode对象的集合。
Count As Long:返回集合中CustomXMLNode的数量。
Item(Index as Long)As CustomXMLNode
参数:Index:Long,表示集合中所需CustomXMLNode的索引。
这是CustomXMLNodes对象的默认成员,并且它返回对应于集合中所请求项的CustomXMLNode对象。
CustomXMLNode
AppendChildNode([Name As String],[NamespaceURI As String],[NodeType AsmsoCustomXMLNodeType],[Node Value As String])As Void
参数:Name:可选的String,表示要被添加到XML DOM的节点的基本名称。Namespace:可选的String,表示要被添加到XML DOM的元素的命名空间。在添加msoCustomXMLNodeElement或msoCustomXMLNodeAttribute类型的节点时需要,否则忽略。NodeType:可选的msoCustomXMLNodeType,它指定要创建的节点类型。如果没有指定,假设为msoCustomXMLNodeElement。NodeValue:可选的String,用于设置允许文本的节点的节点值。如果该节点不允许文本,则忽略该参数。
如果该上下文节点是msoCustomXMLNodeElement类型,则允许开发者添加单个节点作为树中上下文元素下的最后一个子节点。如果否,则该方法失败,且错误为:“不能向注释、处理指令或属性附加子节点”。还阻止其中要添加的节点是已经存在的属性的任何情形:“在当前元素上已存在同名属性”。
AppendChildSubtree(XML As String)As Void
参数:XML:String,表示要添加到XML DOM的子树。该XML必须是合式的XML文档(包括命名空间声明、单一根节点等等)。如果否,则失败,且错误为:“要添加XML子树到你的文档,它必须包含有效、合式的XML”。
如果该上下文节点是msoCustomXMLNodeElement类型,则允许开发者添加现有的合式XML子树作为DOM中上下文元素下的最后一个子节点。如果否,则该方法失败,且错误为:“不能向注释、处理指令或属性附加子节点”。
Attributes As CustomXMLNodes():返回CustomXMLNode集合,表示当前元素上的属性。
BaseName As String:这是CustomXMLNode的默认成员。它返回没有命名空间前缀的节点基本名称,如果在DOM中存在一个的话。
ChildNodes As CustomXMLNodes:返回CustomXMLNodes集合,包含作为当前节点的子节点的所有元素。
Delete As Void:从XML DOM删除当前节点(包括其所有子节点,如果有的话)。如果所得删除在结构上非法,则失败,且错误消息为:“该操作不能完成,因为它导致在结构上非法的DOM”。
FirstChild As CustomXMLNode:返回CustomXMLNode对象,对应于当前节点的第一个子元素。如果该节点没有子元素(或者它本身不是msoCustomXMLNodeElement类型),则返回Nothing。
HasChildNodes As Boolean:如果当前节点具有子元素节点则返回TRUE,否则FALSE。当CustomXMLNode不是msoCustomXMLNodeElement节点类型时,这将返回FALSE。
InsertNodeBefore([Name As String],[NamespaceURI As String],[NodeType AsmsoCustomXMLNodeType],[NodeValue As String],[NextSibling asCustomXMLNode])As Void
参数:Name:String,表示要被添加到XML DOM的节点的基本名称。Namespace:可选的String,表示要被添加到XML DOM的元素的命名空间。在添加msoCustomXMLNodeElement或msoCustomXMLNodeAttribute类型的节点时需要,否则忽略。NodeType:可选的msoCustomXMLNodeType,指定要创建的节点类型。如果未指定,则假设为msoCustomXMLNodeElement。NodeValue:可选的String,用于设置允许文本的节点的节点值。如果该节点不允许文本,则忽略该参数。NextSibling:可选的CustomXMLNode对象,指定一节点,在其之前应当将新的XML元素添加到树。
在指定位置处将新的子节点插入到树中。如果当添加msoCustomXMLNodeElement、msoCustomXMLNodeComment或msoCustomXMLNodeProcessinglnstruction类型的节点时未呈现BeforeNode,则将节点添加到列表的末尾。如果添加为msoCustomXMLNodeAttribute类型,则忽略它。如果NextSibling不是上下文节点的子节点,则该方法失败:“该XML节点不能被添加,因为下一个兄弟元素必须是上下文元素的子元素”。如果所得到的添加在结构上非法(并且模式实施被启用),则失败,且错误消息为:“该操作不能完成,因为它导致在结构上非法的DOM”。还阻止其中将被添加的节点为已存在的属性的任何情形:“在当前元素上已存在同名的属性”。
InsertSubtreeBefore(XML As String,[NextSibling as CustomXMLNode])AsVoid
参数:XML:String,表示添加到XML DOM的子树。该XML必须是合式的XML文档(包括命名空间声明、单一根节点,等等)。如果否,则失败,且错误为:“要添加XML子树到你的文档,它必须包含有效的合式的XML”。NextSibling:可选的CustomXMLNode对象,指定一节点,在其之前应当将新的XML元素添加到树。
在指定位置处将指定XML子树插入到子节点组中。如果NextSibling不是上下文节点的子节点,则该方法失败:“该XML节点不能被添加,因为下一个兄弟节点必须是上下文元素的子元素”。如果所得到的添加在结构上非法,则失败,且错误消息为:“该操作不能完成,因为它导致在结构上非法的DOM”。
LastChild As CustomXMLNode:返回CustomXMLNode对象,对应于当前节点的最后一个子元素。如果节点没有子元素(或者如果它本身不是msoCustomXMLNodeElement类型),则返回Nothing。
NamespaceURI As String[read-only(只读)]
返回String,对应于当前节点的命名空间。如果节点是msoCustomXMLNodeComment、msoCustomXMLNodeProcessinglnstruction类型,则返回“”。
NextSibling As CustomXMLNode:返回当前节点的下一个兄弟节点(元素、注释或者处理指令)。如果节点是其所在层上的最后一个兄弟节点,则返回Nothing。
NodeType As msoCustomXMLNodeType:返回msoCustomXMLNodeType常量,表示当前节点的类型。
Node Value As String:取得/设置仅包含文本的节点(即文本节点、注释、处理指令、属性)内部的文本。对于元素,失败:“不能设置元素节点的NodeValue参数”。
OwnerDocument As Variant:返回Document(文档)/Workbook(工作簿)/Presentation(演示)对象,表示关联于该节点的Word文档。
OwnerStream As CustomXMLPart:返回CustomXMLPart对象,表示关联于该节点的数据存储项。
PreviousSibling As CustomXMLNode:返回当前节点的前一兄弟节点(元素、注释或处理指令)。如果节点是其所在层上的第一个兄弟节点,则返回Nothing。
ParentNode As CustomXMLNode:返回当前节点的父元素节点。如果节点在根层上,则返回Nothing。
RemoveChild(Child As CustomXMLNode)As Void
参数:Child:CustomXMLNode对象,表示要删除的上下文节点的子节点。如果该节点不是上下文节点的子节点,则失败,且错误消息为:“该节点不能移除,因为它不是当前元素的子节点”。
从流中移除指定的子节点。如果所得到的DOM在结构上非法,则失败,且错误消息为:“该操作不能完成,因为它导致在结构上非法的DOM”。
ReplaceChildNode(Name As String,[Namespace As String],[NodeType AsmsoCustomXMLNodeType],[Node Value As String],OldNode As CustomXMLNode)As Void
参数:OldNode:CustomXMLNode,表示要被取代的子节点。Name:String,表示要被添加到XML DOM的元素的基本名称。Namespace:可选的String,表示要被添加到XML DOM的元素的命名空间。在添加msoCustomXMLNodeElement或msoCustomXMLNodeAttribute类型的节点时需要,否则忽略。NodeType:可选的msoCustomXMLNodeType,指定要创建的节点类型。如果未指定,则假设为msoCustomXMLNodeElement。NodeValue:可选的String,用于设置允许文本的节点的节点值。如果该节点不允许文本,则忽略该参数。
从流移除指定的子节点(及其子树),并且在同一位置中用指定的节点取代它。如果OldNode不是上下文节点的子节点,则失败,且错误消息为:“OldNode必须是当前节点的子节点”。如果所得到的取代在结构上是非法的,则失败,且错误消息为:“该操作不能完成,因为它导致在结构上非法的DOM”。还阻止其中将添加的节点为已存在属性的任何情形:“在当前元素上已存在同名属性”。
ReplaceChildSubtree(XML As String,OldNode As CustomXMLNode)As Void
参数:OldNode:CustomXMLNode,表示要取代的子节点。XML:String,表示要添加到XML DOM的子树。这XML必须是合式的XML文档(包括命名空间声明、单一根节点,等等)。如果否,则失败,且错误为:“要添加XML子树到你的文档,它必须是有效的合式的XML”。
从流中移除指定的节点(及其子树),并且在同一位置用指定的XML子树取代它。如果OldNode不是上下文节点的子节点,则失败,且错误消息为:“OldNode必须是当前节点的子节点”。如果所得到的取代在结构上是非法的,则失败,且错误消息为:“该操作不能完成,因为它导致在结构上非法的DOM”。
SelectNodes(XPath As String)As CustomXMLNodes()
参数:XPath:String,包含针对DOM求值的XPath表达式。该XPath的前缀映射是从NamespaceManager性质检索的。如果XPath没有解析,则传递任何存在错误的地方(按目前的具有嵌入的XML的Document对象上的该方法)。
该方法允许开发者从数据存储项内取回一组节点。
SelectSingleNode(XPath As String)As CustomXMLNode()
参数:XPath:String,包含针对DOM求值的XPath表达式。该XPath的前缀映射是从NamespaceManager性质检索的。如果XPath没有解析,则传递任何存在错误的地方(按目前的具有嵌入的XML的Document对象上的该方法)。
该方法允许开发者从数据存储项内取回单个节点。
Text As String:取得/设置当前节点的文本。与MSXML不同,在节点上设置这个用指定的串取代该节点的内容——例如,在其中foo的内容类似如下的非叶元素<foo>上将它设置为“test”:
<foo>
Bar
<baz>hello</baz>
</foo>
将不会失败,但将导致在内部对于数据存储和在外部对于数据存储的客户的不同消息。如果所得到的取代在结构上是非法的,则失败,且错误消息为:“该操作不能完成,因为它导致在结构上非法的DOM”。
XML As String:返回当前节点及其子节点(如果有的话)的原始XML表示。
XPath As String:返回具有当前节点的规范化的XPath的串。如果节点不再在DOM中(它被删除),则失败:“该节点已从关联于定制XML部分中删除”。
New Enums:
msoCustomXMLNodeType,表示可用的XML节点类型。msoCustomXMLNodeAttribute,表示XML属性节点。msoCustomXMLNodeCData表示CDATA节点。msoCustomXMLNodeComment表示XML注释节点。msoCustomXMLNodeDocument表示XML文档(/)节点。msoCustomXMLNodeElement表示XML元素节点。msoCustomXMLNodeProcessingInstruction表示XML处理指令节点。msoCustomXMLNodeText表示文本节点。
ReplaceChild(Child As CustomXMLNode,Name As String,[Namespace AsString],[NodeType As String],[NodeValue As String])As CustomXMLNode
参数:Child:CustomXMLNode对象,表示要被删除的上下文节点的子节点。如果该节点不是上下文节点的子节点,则失败,且错误消息为:“该节点不能被移除,因为它不是当前元素的子节点”。Name:String,表示要被添加到XML DOM的节点的基本名称。Namespace:可选的String,表示要被添加到XML DOM的节点的命名空间。在添加msoCustomXMLNodeElement或msoCustomXMLNodeAttribute类型的节点时需要,否则忽略。NodeType:可选的msoCustomXMLNodeType,指定要创建的节点类型。如果未指定,则假设为msoCustomXMLNodeElement。NodeValue:可选的String,用于设置允许文本的节点的节点值。如果该节点不允许文本,则忽略该参数。
从流中移除指定的子节点(及其子树),并且在同一位置用指定节点取代它。如果所得到的删除在结构上是非法的(并且模式实施被启用),则失败,且错误消息为:“该操作不能完成,因为它导致在结构上非法的DOM”。
XMLNamespace:该对象表示模式库中的单个唯一的命名空间。
AttachToCustomXMLPart(CustomXMLPart As Variant)As Void
参数:CustomXMLPart:Variant,它可以是所需流的CustomXMLPart对象,或者是CustomXMLParts集合中的该流的索引。
将该XML命名空间的模式附连到给定的CustomXMLPart。
XMLShemaReference:该对象表示在当前文档中引用的单个唯一的命名空间。
Delete()As Void:从CustomXMLPart中移除命名空间以及该命名空间中的元素。然而,在该情形中数据存储可拒绝该操作,因为启用结构性模式强制,于是移除这些元素将导致在结构上非法的DOM。在该情形中,失败并且抛出错误:“该操作不能在启用模式强制的同时执行,因为所得到的流在结构上是非法的”。
Add(Name As String,Namespace As String,[Parent As CustomXMLNode],[NextSibling As CustomXMLDataNode],[NodeType AsmsoXMLNodeType],[NodeValue As String])As CustomXMLNode
参数:Name:String,表示要被添加到XML DOM的节点的基本名称。Namespace:可选的String,表示要被添加到XML DOM的节点的命名空间。在添加msoCustomXMLNodeElement或msoCustomXMLNodeAttribute类型的节点时需要,否则忽略。Parent:可选的CustomXMLPart,表示该节点应当被添加其下的节点。如果取消(call off of)由.Attributes性质返回的CustomXMLNodes集合,则假设为这些属性的父节点。如果在任何其它情形中被调用,则指定该参数或者返回错误:“必须指定父节点来添加该节点到你的文档”。NextSibling:可选的CustomXMLNode,表示应当成为新节点的下一兄弟的节点。如果未指定,则将节点添加到父节点的子节点的末尾。忽略msoCustomXMLNodeAttribute类型的添加。如果NextSibling不是父节点的子节点,则返回错误:“该节点不能被添加,因为下一兄弟节点不是父节点的子节点”。NodeType:可选的msoCustomXMLNodeType,指定要创建的节点类型。如果未指定,则假设为msoCustomXMLNodeAttribute,除非取消.Attributes性质,则假设为msoCustomXMLNodeElement。NodeValue:可选的String,用于设置允许文本的节点的节点值。如果节点不允许文本,则忽略该参数。
用于添加XML节点到数据存储项的普适方法。如果取消由.Attributes性质返回的CustomXMLNodes对象,则Parent具有默认的父节点并且NodeType具有默认的msoCustomXMLNodeAttribute。在所有其它情形中,需要Parent并且NodeType默认为msoCustomXMLNodeElement。如果所得到的添加在结构上是非法的(并且模式强制被启用),则失败,且错误消息为:“该操作不能在启用模式强制时完成,因为它导致在结构上非法的数据流”。如果命名空间不在模式引用集合中,则失败,并且错误消息为:“要添加该元素,必须首先将其模式附连到数据流”。
CustomDataXML SchemaReferences():Collection(集合),表示在CustomXMLPart中标识的所有的唯一命名空间。注意:默认地,用在XML文件中声明的每一命名空间的条目来填充它。
Add([NamespaceURI As String],[Alias As String],[FileName As String],[InstallForAllUsers As Boolean=False])As XMLSchemaReference
参数:NamespaceURI:String,包含由要添加到模式集合的模式定义的命名空间。Alias:String,包含当将该模式添加到模式库时要写的别名。FileName:String,包含指向应添加到模式库的模式的路径。InstallForAllUsers:Boolean,确定模式库键应当被添加到HKCU(默认)还是HKLM。
该方法添加模式引用。为完成这个,如果在文件中还没有定义命名空间,则向CustomXMLPart的根元素添加合适的命名空间声明。在打开时,使用所有被声明的命名空间来填充该集合。
EnforceStructure As Boolean:取得和设置对应于数据存储是否应当按照其模式对相关联的CustomXMLPart强制结构有效性的布尔值。如果用户尝试在CustomXMLPart的内容不是有效时将此属性设置为TRUE,则返回错误:“当该数据流的内容在结构上是非法时,不能启用模式强制”。
Count As Long:返回在该CustomXMLPart中当前引用的命名空间的数量。
Item(Index As Variant)As XMLSchemaReference
参数:Index:Variant,可以是以下两种类型之一:Long,表示集合中所需CustomDataXMLSchemaReference的索引;以及String,表示集合中所需CustomDataXMLSchemaReference的命名空间。
这是CustomDataXMLSchemaReferences对象的默认成员,并且它返回对应于所请求对象的XMLSchemaReference对象。
Validate()As Void:该方法针对CustomDataXMLSchemaReferences集合中的所有模式来验证整个流。在各个节点上报告错误(见.ValidationStatus性质)/
CustomXMLNode
NodeAfterInsert(NewCustomXMLNode as CustomXMLNode,InUndoRedo asBoolean).
参数:NewCustomXMLNode:CustomXMLNode对象,对应于刚添加到CustomXMLPart的节点。注意:该节点可能具有子节点(如果子树刚被添加到文档)。InUndoRedo:Boolean,如果节点作为用户的撤消/重做动作一部分被添加则返回TRUE,否则FALSE。
每当XML节点将被添加到当前文档,该事件激发。如果添加操作涉及到将XML文档子树添加到CustomXMLPart,则为最顶端节点的改变,就激发该事件一次。为通过消息发送到数据存储的每一改变,该事件激发一次,因此由该事件表示的改变的副效应也触发该事件。
NodeBeforeDelete(OldCustomXMLNode as CustomXMLNode,InUndoRedo asBoolean)
参数:OldCustomXMLNode:CustomXMLNode对象,对应于将要从CustomXMLPart移除的节点。注意:该节点可能具有子节点(如果从文档移除子树)。InUndoRedo:Boolean,如果节点作为用户的撤消/重做动作一部分被添加则返回TRUE,否则FALSE。
每当XML节点从数据存储中当前项被删除,该事件激发。如果删除操作涉及到将XML文档子树添加到CustomXMLPart,则为最顶端节点的改变,就激发该事件一次。为通过消息发送到数据存储的每一改变,该事件激发一次,因此由该事件表示的改变的副效应也触发该事件。如果事件处理程序尝试修改在该节点下的任何内容,则失败,且错误消息为:“不允许该改变,因为该节点将被删除”。
以上说明、示例和数据提供了对本发明成分的制造和使用的全面描述。因为可以在不背离本发明的精神和范围的情况下做出本发明的许多实施例,所以本发明位于所附权利要求的范围内。