gpt4 book ai didi

xml - 使用 MSXML 创建 XML 的最佳方式是什么

转载 作者:数据小太阳 更新时间:2023-10-29 02:06:13 26 4
gpt4 key购买 nike

目前我正在创建这样的 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 要创建 - 我最终得到了 appendchilds 的负载和很多对象 - 这种接缝效率低下并且容易出错 - 但有优势我可以随时将对象添加到先前创建的对象。

对于 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

最佳答案

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

关于xml - 使用 MSXML 创建 XML 的最佳方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30299723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com