第三章 理解XML 这里的学习内容包括如何创建访问和操纵内置功能区所需的核心XML框架。 什么是XML,为什么需要XML XML是Extensible Markup Language的缩写,最初由W3C发布。XML不是编程语言,它缺乏执行操作的任何机制。XML是一组规则,其意图是简化跨平台的数据共享。 Office 2007文件以Microsoft的OpenXML格式配置,是包含几个XML文件的一个简单的压缩容器。 (1)XML节省空间。 (2)结构化数据后,能够快速地被索引,因而能使其他程序为特定的字符串或其他项目搜索索引。 (3)对于开发者来说,能够链接某个应用程序里的XML架构来验证XML而确保像意料中的那样工作。例如前一章中介绍的CustomUI Editor和XML Notepad,如果没有这些架构,CustomUI Editor将不能验证代码,XML Notepad不能提供智能感知功能。 现在我们关心XML,是因为XML是Ribbon的核心。要定制Office 2007用户界面,必须编写XML代码,虽然VBA在定制中也能起到关键的作用,但它不是必需的。而XML在定制中几乎总是必需的,但也有例外。例如弹出式菜单和一些出现在加载项选项卡中的VBA定制。 本章下面的内容将集中介绍如何从头开始创建XML框架,引导您通过必需的XML创建和修改功能区。 基本的背景知识 即,XML的构成及如何编写XML。 1、标签(Tags) 例如,下面的代码片断: <group id=”rxgrpTest”> <button idMso=”Bold”/> <button idMso=”Italic”/> <splitButton id=”rxsbtnTest”> <button idMso=”Underline”/> </splitButton> </group> 看看上面代码的结构,注意<、>和/号的使用,指示了标签的开始和结束。例如开始的<group>标签和结束的</group>标签之间的内容包含了在功能区中显示的组。 此外,注意到按钮的代码,其中/号位于标签的结尾,不需要单独的标签来关闭元素。 其实,上面演示了使用标签的两种方法。您需要理解并使用这些方法来创建自定义UI的结构。如下面的表格所示: 表:开始和关闭标签的形式 开始和关闭标签分开 <element attribute(s)=”Value”></element> 开始和关闭标签未分开 <element attribute(s)=”Value”/> (1)在XML中,每个标签至少包含一个元素和通常至少一个属性 (2)在处理代码时,涉及的每个项目都被称作对象(object)。例如,对象包括功能区中的组、按钮、复选框、甚至是菜单。当某控件有子控件时,将该控件称为父控件。 注意,父对象通常(但不总是)有不同类型的子对象。选项卡有一个或多个组对象作为子对象,并且一个组可能有按钮、复选框和动态菜单子对象的组合。其中,dynamicMenu对象除了其他子对象类型外,还有dynamicMenu子对象。某些父对象甚至有完整的子对象群,称之为集合(collection)。 每个子对象也能够成为它自已的子对象的父对象。每个子对象控件必须嵌套在其父对象的开始和结束标签中。 (3)为了创建格式良好(有效的)XML,必须理解: 所有标签,无论是元素还是必属,都区分大小写,即SPLITBUTTON元素与splitButton元素不相同。 属性值必须被放置在单引号或双引号内。 在父元素中的子元素的嵌套必须准确。每个开始标签必须与其结束标签相匹配。 2、元素(Elements) 当处理功能区的XML时,可以看到每个元素指定功能区控件(或结构)的特定部分。 group是一个元素,而<group>是一个标签。因此,标签实质上是通过<和>符号识别代码块的标志。 每个标签必须包括一个且唯一一个元素。此外,元素总是XML标签的第一部分。告诉编译器希望开始处理或停止处理的特定项目。 3、属性(Attributes) 标签告诉编译器要处理的对象,而属性告诉编译器该对象的属性,包括对象的名称、在屏幕中显示的标题以及是否对象可见。 与元素不同的是,在所给标签内可以为对象设置多个属性。例如,下面的代码片断显示了带有多个属性的标签示例: <button id="rxbtnProtectAll" size="normal" label="Protect All Sheets" imageMso="ReviewProtectWorkbook" onAction="rxbtnProtectAll_click"/> 上面的代码提供给按钮一个唯一的id并指定了大小、标签和图像,此外也提供了一个onAction回调签名,当单击该按钮时启动相应的VBA过程。 (1)id属性 在创建额外的对象之前,需要讨论如何在代码中识别这些对象。而id属性用于识别在自定义XML代码内指定的对象,为其提供名称,使得后面能够使用该名称引用该对象。这是引用对象的唯一方法。在下列容器中每个对象都需要id属性: contextualTabs officeMenu qat tabs id属性有几种不同的类型并且每一个都有不同的使用。下表描述了id属性的不同类型及其主要用途。 表:id属性表 属性 何时使用 id 用于唯一地标识控件。如果动态地装载项目,其属性将被赋值 idMso 用于唯一地标识内置控件、选项卡、命令,等等。使用该属性与内置对象交互 idQ 用于跨共享的命名空间引用对象。 为了识别某对象,简单地在开始标签中添加id属性,例如: <tab id="rxtab" <!-- Other tab attributes would go here! --> </tab> 同样地,如果试图引用内置的字体(Font)组,使用下面的XML: <group idMso="Font" <!-- Other group attributes would go here! --> </group> 注意,所有的id和idQ属性都是唯一的。如果使用已存在的id,或者由Microsoft保留的id,将会导致错误并阻止UI装载。 为了避免与内置的控件相冲突,建议所有自定义控件使用标准的命名约定加上前缀。 (2)label属性 即用户能够在屏幕上读取的内容,不必是唯一的,但应该是合乎逻辑、简洁明了且一致。Label属性为用户提供清晰的向导。要添加标签,如下面的代码: <tab id="rxtab" label="My Custom Tab"> </tab> 4、布置XML代码的技巧 使用硬回车或制表符将代码分成逻辑块,容易阅读和解释。下面是一段示例代码,更容易阅读: <group id="rxgrp" label="My First Group"> <button id="rxbtn1" imageMso="Italic" label="Large size button" size="large" onAction="rxbtn1_Click"/> <button id="rxbtn2" imageMso="Bold" label="Normal size button" size="normal" onAction="rxbtn2_Click"/> <button id="rxbtn3" imageMso="WrapText" label="Normal size button" size="normal" onAction="rxbtn3_Click"/> <button id="rxbtn4" imageMso="ConditionalFormatting" label="Normal size button" size="normal" onAction="rxbtn4_Click"/> </group> 5、在XML代码中创建注释 注释能够使自已或他人清楚代码的作用。放置注释的方法是:在开始处放置一个小于号(<),然后输入感叹号(!),随后是两个连字号(--),结束注释需要两个连字号加一个大于号(>)。 <!-- This is a comment --> 如果注释很长,可能需要几行,如下所示: <!-- This is a comment that has become extremely long.Since you decided that you do not want to have short,one line comments to describe what you are doing, you let it run over several lines. --> 在<!--和-->之间的被当作连续的注释。 此外,不能够将注释放置在一块开始的XML代码的中间。下面的示例来进行演示: <!-- This is my first button --> <button id="rxbtn" label="This is my button" imageMso="HappyFace" size="large" onAction="rxbtn_Click"/> 或: <button id="rxbtn" label="This is my button" imageMso="HappyFace" size="large" onAction="rxbtn_Click"> <!-- This is my first button --> </button> 上述两段代码都是正确的,但下面的代码会产生错误: <button id="rxbtn" <!-- This is my first button --> label="This is my button" imageMso="HappyFace" size="large" onAction="rxbtn_Click"/> 上面的问题在于注释被插入到了未关闭的代码块中。
|