使用MSXML创建XML的最佳方法是什么

时间:2015-05-18 09:38:20

标签: xml vba msxml

目前我正在创建这样的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

1 个答案:

答案 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文件,我不知道如何在此处上传或是否可能...

Sample excel file with Vba as requested