VBA中操作XML

OFFICE2007之后使用了OpenXml标准(伟大的改变),定制文本级的Ribbon可以通过修改压缩包内的xml文件来实现。

    先学习一下VBA中操作XML的方法

    先引用Microsoft XML V6.0,对应的文件是msxml6.dll。前期绑定,方便使用智能提示。

    一、DOM方式创建一个XML文件:内容是自定义Ribbon的一个简单框架。文件保存在桌面。

 1 Sub CreateXmlFile()
 2 
 3    '创建文档对象模型
 4    Dim xmldoc As New DOMDocument
 5    
 6    '创建根节点,XML文档有且必须仅有一个根节点。
 7    Dim root As IXMLDOMElement
 8    'http://schemas.microsoft.com/office/2006/01/customui  2007版本使用的命名空间
 9    'http://schemas.microsoft.com/office/2009/07/customui  2010版本使用的命名空间
10         Set root = xmldoc.createElement("customUI")
11             root.setAttribute "xmlns", "http://schemas.microsoft.com/office/2009/07/customui"
12         Set xmldoc.DocumentElement = root       '指定根节点
13    
14    'ribbon元素
15    Dim xmlribbon As IXMLDOMElement
16         Set xmlribbon = xmldoc.createElement("ribbon")
17 root.appendChild xmlribbon 18 19 'tabs元素 20 Dim xmltabs As IXMLDOMElement 21 Set xmltabs = xmldoc.createElement("tabs") 22 xmlribbon.appendChild xmltabs 23 24 'tab元素 25 Dim xmltab As IXMLDOMElement 26 Set xmltab = xmldoc.createElement("tab") 27 xmltab.setAttribute "id", "CustomTab" 28 xmltab.setAttribute "label", "自定义标签" 29 xmltabs.appendChild xmltab 30 31 'group元素 32 Dim xmlgroup As IXMLDOMElement 33 Set xmlgroup = xmldoc.createElement("group") 34 xmlgroup.setAttribute "id", "CustomGroup" 35 xmlgroup.setAttribute "label", "自定义分组" 36 xmltab.appendChild xmlgroup 37 38 'button元素,并设置button的属性 39 Dim xmlbutton As IXMLDOMElement 40 Set xmlbutton = xmldoc.createElement("button") 41 xmlbutton.setAttribute "id", "btn" 42 xmlbutton.setAttribute "label", "插入公司名称" 43 xmlbutton.setAttribute "size", "large" 44 xmlbutton.setAttribute "onAction", "InsertCompanyName" 45 xmlgroup.appendChild xmlbutton 46 47 '文件保存到桌面 48 xmldoc.Save ("C:UsersstoneDesktop1.xml") 49 End Sub

 下面是创建出来xml文件内容。创建出的文件标签不能自动换行。只好手工排版。 

 1 <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
 2     <ribbon>
 3         <tabs>
 4             <tab id="CustomTab" label="自定义标签">
 5                 <group id="CustomGroup" label="自定义分组">
 6                     <button id="btn" label="插入公司名称" size="large" onAction="InsertCompanyName"/>
 7                 </group>
 8             </tab>
 9         </tabs>
10     </ribbon>
11 </customUI>

二、对已有的XML文件添加新的元素:给group添加一个menu元素,menu元素下添加两个button子元素

 1 Sub AppendXmlFile()
 2 
 3     Dim xmldoc As New DOMDocument
 4     
 5     Dim b As Boolean
 6     '加载xml文件,成功返回true
 7     b = xmldoc.Load("C:UsersstoneDesktop1.xml")
 8     If Not b Then Exit Sub
 9 
10 '    Dim xmlgroups As IXMLDOMNodeList
11 '    Dim xmlgroup As IXMLDOMElement
12 '    Set xmlgroups = xmldoc.getElementsByTagName("group")     '所有的group元素,返回一个集合
13 '    Set xmlgroup = xmlgroups(0)                              '取集合中第一个group元素
14      
15     Dim xmlgroup As IXMLDOMNode
16     'Xpath  选取第一个group节点
17     Set xmlgroup = xmldoc.SelectSingleNode("//tab[@id='CustomTab']/group[0]")
18                  
19     'menu元素
20     '为了避免产生xmlns="",要添加的节点的namespaceURI需要和父节点一致。下同
21     Dim xmlmenu As IXMLDOMElement
22     Set xmlmenu = xmldoc.createNode(NODE_ELEMENT, "menu", xmlgroup.NamespaceURI)
23         xmlmenu.setAttribute "id", "CustomMenu"
24         xmlgroup.appendChild xmlmenu
25     
26     'button元素
27     Dim xmlbutton1 As IXMLDOMElement
28     Set xmlbutton1 = xmldoc.createNode(NODE_ELEMENT, "button", xmlmenu.NamespaceURI)
29         xmlbutton1.setAttribute "id", "btn1"
30         xmlbutton1.setAttribute "label", "按钮一"
31         
32     Dim xmlbutton2 As IXMLDOMElement
33     Set xmlbutton2 = xmldoc.createNode(NODE_ELEMENT, "button", xmlmenu.NamespaceURI)
34         xmlbutton2.setAttribute "id", "btn2"
35         xmlbutton2.setAttribute "label", "按钮二"
36         
37     xmlmenu.appendChild xmlbutton1
38     xmlmenu.appendChild xmlbutton2
39         
40     Debug.Print xmldoc.XML
41     xmldoc.Save ("C:UsersstoneDesktop1.xml")
42     
43 End Sub

下面是添加新节点后的XML文件内容

 1 <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
 2     <ribbon>
 3         <tabs>
 4             <tab id="CustomTab" label="自定义标签">
 5                 <group id="CustomGroup" label="自定义分组">
 6                     <button id="btn" label="插入公司名称" size="large" onAction="InsertCompanyName"/>
 7                     <menu id="CustomMenu">
 8                         <button id="btn1" label="按钮一"/>
 9                         <button id="btn2" label="按钮二"/>
10                     </menu>
11                 </group>
12             </tab>
13         </tabs>
14     </ribbon>
15 </customUI>

 一个小知识点:

创建子节点时,如果没有指名namespaceURI,在appendchild后,子节点带一个xmlns=""的属性。如果创建子节点时指定namespaceURI等于父节点的URI可以屏蔽这个麻烦,就不会生成xmlns=""了。

DOMDocument的两个方法:

Function selectNodes(queryString As String) As IXMLDOMNodeList

Function selectSingleNode(queryString As String) As IXMLDOMNode

queryString是一个Xpath表达式。

Xpath语法参考W3C网站:http://www.w3school.com.cn/xpath/xpath_syntax.asp

原文地址:https://www.cnblogs.com/zzstone/p/5562543.html