如何在VBA中使用元素名作为文件名保存xml附件

如何在VBA中使用元素名作为文件名保存xml附件,xml,vba,outlook,Xml,Vba,Outlook,我目前有两个模块,它们在VBA中根据需要工作,这些模块是由我在谷歌上找到的零碎东西创建的 我想将它们合并到一个Outlook可以作为规则处理的流程中 第一个模块从outlook保存带有日期扩展名的XML电子邮件附件,并由outlook规则激活 第二种方法使用getElementsByTagName显示msgbox硬盘上文件的序列号 有没有一种方法可以将这两种方法组合成一个自动过程,从电子邮件中保存XML附件,并使用XML附件中的序列号元素标记名对其进行重命名 下面列出了每个的代码 单元1: Pu

我目前有两个模块,它们在VBA中根据需要工作,这些模块是由我在谷歌上找到的零碎东西创建的

我想将它们合并到一个Outlook可以作为规则处理的流程中

第一个模块从outlook保存带有日期扩展名的XML电子邮件附件,并由outlook规则激活

第二种方法使用
getElementsByTagName
显示msgbox硬盘上文件的序列号

有没有一种方法可以将这两种方法组合成一个自动过程,从电子邮件中保存XML附件,并使用XML附件中的序列号元素标记名对其进行重命名

下面列出了每个的代码

单元1:

Public Sub saveXMLtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim dateFormat
Dim saveFolder As String
saveFolder = "C:\temp\xml folder\"
dateFormat = Format(Now, "mm-dd-yyyy H-mm-ss")

 For Each objAtt In itm.Attachments
    If InStr(objAtt.DisplayName, ".xml") Then
     objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName & dateFormat & ".xml"

      End If
      Set objAtt = Nothing
      Pause 1
      Next
End Sub
单元2:

Sub GetSN()

Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.SetProperty "SelectionLanguage", "XPath"
xmlDoc.async = False
xmlDoc.Load ("C:\Temp\savetest.xml")

Set nodeXML = xmlDoc.getElementsByTagName("SerialNumber")
For i = 0 To nodeXML.Length - 1
MsgBox nodeXML(i).Text

Next
End Sub

实际上,您已经拥有了所需的一切,并且实际上可以通过一些细微的更改将代码合并到单个例程中

GetSN
例程中,当前正在消息框
MsgBox nodeXML(i).Text
中显示序列号

不要这样做,你应该把它分配给一个变量,以便以后很容易引用它

serialNumber=nodeXML(i).Text

现在,在“saveXMLtoDisk”中,在保存文件时只需包含此项

objAtt.SaveAsFile saveFolder&“\”&objAtt.DisplayName&“&serialNumber&“&dateFormat&.xml”

简单地说,将
GetSN
的内容放在现有
saveXMLtoDisk
例程的顶部,并进行上述更改

编辑以响应关于从附加的XML文件中提取序列号

我认为最简单的方法是将附加XML文件的临时副本保存在PC上的某个位置,然后在调用
xmlDoc.Load
时引用该副本。捕获序列号后,可以删除此临时副本,并使用正确格式的名称保存永久副本。我复制了下面的完整代码示例(注释与我更改原始代码的代码一致)


谢谢你的快速回复!因此,如果我想删除xmlDoc.Load(“C:\Temp\savetest.xml”)引用,那么我是否会删除它,以便扫描当前的xml附件,而不仅仅是位于Temp文件夹中的附件?抱歉,我错过了您说要从附加的xml文件中获取序列号的部分。我认为最简单的方法是将附件的临时副本保存在某处,然后在
xmlDoc.Load
中引用该副本。完成后,您将删除此副本,并使用正确格式的名称保存实际文件。我用一个例子编辑了答案,这很有效!我只需要添加一些参考资料,一切都很好。我在顶部添加了:tempfolder=“c:\temp\”,并在“将xml保存到临时位置”下添加了:objAtt.SaveAsFile tempfolder&“\”&objAtt.DisplayName。
Public Sub saveXMLtoDisk(itm As Outlook.MailItem)
    Dim objAtt As Outlook.Attachment
    Dim dateFormat As String
    Dim saveFolder As String
    saveFolder = "C:\temp\xml folder\" 
    dateFormat = Format(Now, "mm-dd-yyyy H-mm-ss")

     For Each objAtt In itm.Attachments
        If InStr(objAtt.DisplayName, ".xml") Then

            ' Save the XML to a temporary location
            Dim tempXML As String: tempXML = "C:\temp\attachment.xml"
            Dim serialNumber As String

            ' Start of GetSN Code
            Set xmlDoc = CreateObject("Microsoft.XMLDOM")
            xmlDoc.SetProperty "SelectionLanguage", "XPath"
            xmlDoc.async = False
            ' Open the temporary copy of the XML attachment that has been saved.
            xmlDoc.Load (tempXML)

            Set nodeXML = xmlDoc.getElementsByTagName("SerialNumber")
            For i = 0 To nodeXML.Length - 1
                serialNumber = nodeXML(i).Text
            Next

            Set nodeXML = Nothing
            Set xmlDoc = Nothing
            ' End of GetSN Code

            objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName & " " & serialNumber & " " & dateFormat & ".xml"

            ' Remove the temporary copy of the XML attachment
            Kill tempXML

        End If

        Set objAtt = Nothing
        Pause 1
    Next
End Sub