0

XMLファイルから情報を読み取り、特定のファイルをローカルワークステーションにコピーするVB6アプリケーションを作成しています。XMLは次のようになります。

<ArrayOfMediaFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MediaFile>
    <fileName>Default.jpg</fileName> 
    <filePath>C:\Program Files\media</filePath> 
    <dateModified>2012-04-30T14:41:28.6893988-05:00</dateModified> 
    <Action>Add</Action> 
  </MediaFile>
  <MediaFile>
    <fileName>icon.jpg</fileName> 
    <filePath>C:\Program Files\media</filePath> 
    <dateModified>2012-04-30T15:43:31.2995396-05:00</dateModified> 
    <Action>Add</Action> 
  </MediaFile>
</ArrayOfMediaFile>

これで、アプリケーションはファイル名を読み取り、アクションノードが「追加」の場合はファイルをコピーしてアクションノードを「保持」に変換します。

問題

私が今やりたいのは、すべての操作の後にこのファイルを保存することです。XMLの保存中にエラーが発生した場合は、XMLのコピーを作成して、操作で再度使用できるようにする必要があります。

4

1 に答える 1

1

このコードは、常にXMLファイル.xmlを.backupにバックアップし、成功した場合は_Processed.xmlに保存します。それがあなたが望むものであることを願っています。

Private Function ProcessFilesFromXml(ByRef the_sXmlFileName As String) As Boolean

    Dim nPosDot                         As Long
    Dim sXmlFileNamePrefix              As String
    Dim sXmlFileNameSuffix              As String
    Dim oXmlDoc                         As MSXML2.DOMDocument
    Dim oXmlMediaFileNode               As MSXML2.IXMLDOMElement
    Dim oXmlActionNode                  As MSXML2.IXMLDOMElement

    On Error GoTo ErrorHandler

    nPosDot = InStr(1, the_sXmlFileName, ".")

    If (nPosDot) Then
        sXmlFileNamePrefix = Left$(the_sXmlFileName, nPosDot - 1)
        sXmlFileNameSuffix = Mid$(the_sXmlFileName, nPosDot)
    Else
        sXmlFileNamePrefix = the_sXmlFileName
        sXmlFileNameSuffix = vbNullString
    End If

    ' First of all, back up the XML file <XmlFileList>.xml to <XmlFileList>.backup  . Overwrites existing backup file.
    FileCopy the_sXmlFileName, sXmlFileNamePrefix & ".backup"

    On Error GoTo ErrorHandler_ProcessingXml

    ' Load the Xml file <XmlFileList>.xml
    Set oXmlDoc = New MSXML2.DOMDocument
    oXmlDoc.Load the_sXmlFileName

    ' Iterate through each media file, and try to copy it.
    For Each oXmlMediaFileNode In oXmlDoc.selectNodes("/ArrayOfMediaFile/MediaFile")
        If Not CopyFileNameToLocalMachine(oXmlMediaFileNode.selectSingleNode("fileName").Text, oXmlMediaFileNode.selectSingleNode("filePath").Text) Then
            Set oXmlActionNode = oXmlMediaFileNode.selectSingleNode("Action")
            oXmlActionNode.Text = "keep"
        End If
    Next oXmlMediaFileNode

    ' Save under the name <XmlFileList>_Processed.xml
    oXmlDoc.save sXmlFileNamePrefix & "_Processed" & sXmlFileNameSuffix

    ' Since we got here, things must have been fine.
    ProcessFilesFromXml = True

Return_ProcessingXml:
    '
Exit Function

ErrorHandler_ProcessingXml:
    ProcessFilesFromXml = False
    Resume Return_ProcessingXml

ErrorHandler:
    Err.Raise Err.Number, Err.Source, Err.Description
End Function

Private Function CopyFileNameToLocalMachine(ByRef the_sFileName As String, ByRef the_sLocalPath As String)
    ' Your code here.
End Function
于 2012-06-22T15:09:07.520 に答える