目前我正在创建这样的XML - 并且效果很好......
Private Function CreateDom()
Dim dom
Set dom = New DOMDocument
dom.async = False
dom.validateOnParse = False
dom.resolveExternals = False
dom.preserveWhiteSpace = True
Set CreateDom = dom
End Function
Public Function generateXML(sourceFileLocation)
'I make an instance of the dom
Set dom = CreateDom
'This is how I setup a root node
Set rootXML= dom.createElement("root")
dom.appendChild rootXML
'This is how I set attributes
questestinterop.setAttribute "attributeName", "attributeValue"
'setup a child node
Set childOfRoot = dom.createElement("childOfRoot")
rootXML.appendChild childOfRoot
'This is how I set the text of the element
childOfRoot.Text = "Text Value"
End Function
在我上面的基本示例中这是可以的,但是假设我要创建更多的XML - 我最终得到了附加的LOADS和很多对象 - 这种接缝效率低且容易出错 - 但具有优势我可以在任何时候将对象添加到以前创建的对象。
使用MSXML我没有提供InnerXML,所以代码很冗长。我正在采用一种更有效的方法来创建使用MSXML和VBA / VB的XML - 或者是这种工作的最佳实践 - 我可以帮助但感觉有更好的方法。
更新 我上面提到过没有InnerXML - 但有一种方法可以将XML片段加载到DOM中
Sub MergeXML()
'Define
Dim oXml As New MSXML2.DOMDocument
Dim oXml2 As New MSXML2.DOMDocument
'Assign
oXml.loadXML ("<SomeRootElement><Input></Input></SomeRootElement>")
oXml2.loadXML ("<Output><SomeElement></SomeElement></Output>")
'or assign via file
'oXml.Load("c:\Xml.xml")
'oXml2.Load("c:\Xml2.xml")
'Process
oXml.FirstChild.appendChild oXml2.selectSingleNode("//Output")
'Destroy
oXml.Save ("c:\NewXml.xml")
Set oXml2 = Nothing
Set oXml = Nothing
End Sub
来源:http://p2p.wrox.com/beginning-vb-6/28319-xml-using-msxml2-domdocument-object.html
答案 0 :(得分:4)
XML通常是存储在文件中的对象的表示。 .Net有许多流行的软件包可以很容易地进行序列化和反序列化,使你能够从xml的对象和对象生成xml。
VBA缺乏使用这些漂亮软件包的可能性,但我使用的模块基本上都是这样做的。 http://www.kudinov.ru/?p=21
这使您可以专注于构建类并操纵数据。该模块将为您完成XML创建。
<强>更新强>
首先创建您的父类
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "ParentClassContainer"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Public Persons() As ChildClassWithEveryXmlAttributes
其次创建您的子类
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "ChildClassWithEveryXmlAttributes"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
Public FirstName As String
Public LastName as String
Public Birdthday as date
第三,确保包含序列化模块
最后,您可以使用对象并在最后序列化
Sub testSerialize()
Dim myObject As New ParentClassContainer
Redim myObject.Persons(20)
myObject.Persons(0).FirstName = "John"
myObject.Persons(0).LastName = "Doe"
myObject.Persons(0).Birdthday = #2015-05-21#
Serialize myObject, "C:\test.xml", False
End Sub
因此我们创建了一个xml文件,而没有使用msxml中的createElement和appendChild函数。因为你玩对象,所以不容易出错。
XML输出结果
<?xml version="1.0"?>
<Object class="ParentClassContainer">
<PropertyGet name="Persons" type="VT_EMPTY">
<Object class="ChildClassWithEveryXml">
<PropertyGet name="FirstName" type="VT_BSTR">
<![CDATA[John]]>
</PropertyGet>
<PropertyPut name="FirstName" type="VT_BSTR"/>
<PropertyGet name="LastName" type="VT_BSTR">
<![CDATA[Doe]]>
</PropertyGet>
<PropertyPut name="LastName" type="VT_BSTR"/>
<PropertyGet name="Birdthday" type="VT_DATE">
<![CDATA[2015-05-21]]>
</PropertyGet>
<PropertyPut name="Birdthday" type="VT_DATE"/>
</Object>
</PropertyGet>
<PropertyPut name="Persons" type="VT_VARIANT"/>
<PropertyPutRef name="Persons" type="VT_EMPTY"/>
</Object>
我为此创建了一个excel文件,我不知道如何在此处上传或是否可能...