1

だから私はこのようなXMLを持っています...

<?xml version="1.0" encoding="UTF-8"?>

<!--XML Backup.-->
-<Jobs> 
-<Job> 
 <JobName>a</JobName>
   <Source>C:\Users\Public\Pictures\Samplepictures\Lighthouse.jpg</Source> 
    <Source>C:\Users\Public\Pictures\Sample Pictures\Penguins.jpg</Source>  
    <Source>C:\Users\Public\Pictures\Sample Pictures\Tulips.jpg</Source>  
    <Destination>C:\Users\Public\Pictures\Sample Pictures\a.zip</Destination>
   <Timestamp>11/26/2012 6:18:00 PM</Timestamp> 
 </Job> 
-<Job> 
<JobName>b</JobName> 
  <Source>C:\Users\Public\Pictures\demo photo\1 - Copy.JPG</Source>    
  <Source>C:\Users\Public\Pictures\demo photo\1.JPG</Source> 
  <Source>C:\Users\Public\Pictures\demo photo\2 - Copy.JPG</Source> 
  <Destination>C:\Users\Public\Pictures\demo photo\b.zip</Destination> 
  <Timestamp>11/26/2012 6:18:19 PM</Timestamp> 
 </Job> 
</Jobs>

そして、「Job」というラベルの付いた各親ノードを圧縮する必要があります。したがって、最初の zip は "a.zip" で、"tulips.jpg"、"lighthouse.jpg"、"penguins.jpg" が含まれています。

2 番目の zip は、それぞれのファイルを含む "b.zip" になります。

現在、正しい宛先に「a.zip」と「b.zip」を取得していますが、各zipにはすべてのファイルが含まれています。

私が今持っているコードは次のとおりです。

   Dim JobNodes As XmlNodeList
    Dim JobNode As XmlNode
    Dim baseDataNodes As XmlNodeList
    Dim bFirstInRow As Boolean

    JobNodes = doc.GetElementsByTagName("Job")
    For Each jobNode In JobNodes
        baseDataNodes = JobNode.ChildNodes
        bFirstInRow = True

        For Each baseDataNode As XmlNode In baseDataNodes

            Dim Source = baseDataNode.SelectNodes("descendant::Source")
            Dim Destin = baseDataNode.SelectNodes("descendant::Destination")
            Using zip As New ZipFile()

                For Each item As System.Xml.XmlElement In Source
                    zip.AddFile(item.InnerText, "Archive_" & DateString)
                Next

                For Each item As System.Xml.XmlElement In Destin
                    zip.Save(item.InnerText)
                Next
            End Using


            Console.Write(vbCrLf)


            Console.Write(baseDataNode.Name & ": " & baseDataNode.InnerText)
        Next

        Console.Write(vbCrLf)
        Console.Write(vbCrLf)
    Next

また、「descendant::」が必要かどうかも知りたいです...もしそうなら、それは何をしますか?

4

2 に答える 2

1

nSource および nDestin 変数は、現在のジョブだけでなく、ドキュメント内のすべての Source タグと Destination タグのリストです。baseDataNode ループでは、これらの変数に新しい値を割り当てる必要があります。あなたがよく使っているApiはわかりませんが、次のようなことを試してみます:

For Each baseDataNode As XmlNode In baseDataNodes
  Dim nSource = baseDataNode.SelectNodes("descendant::Source")
  Dim nDestin = baseDataNode.SelectNodes("descendant::Destination")
  ...

編集: XmlNode.SelectNodesxpath文字列を受け取ります。「descendant::Source」は、ソース タグである現在のノードのすべての子孫に一致する xpath ステートメントです。

于 2012-11-27T20:52:00.300 に答える
0

答えを探している人は、私が理解した私の解決策を見てください。

[コード]サブメイン()

    Dim doc As New System.Xml.XmlDocument
    Dim myJob As New Atr.backup.Job

    doc.Load("C:\users\matt taylor\desktop\backup\backup.xml")
    myLogger = New Logger("C:\users\matt taylor\desktop\backup\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log")

    Console.SetWindowSize(100, 25)

    Dim JobNodes As XmlNodeList = doc.GetElementsByTagName("Job")
    Dim JobNode As XmlNode
    Dim baseDataNodes As XmlNodeList


    For Each JobNode In JobNodes
        baseDataNodes = JobNode.ChildNodes()


        For Each baseDataNode As XmlNode In baseDataNodes



            myJob.jobName = JobNode.SelectSingleNode("JobName").Name
            myJob.jobSource = JobNode.SelectSingleNode("Source").Name
            myJob.jobDestination = JobNode.SelectSingleNode("Destination").Name
            myJob.jobTimeStamp = JobNode.SelectSingleNode("Timestamp").Name


            Dim Source = JobNode.SelectNodes("Source")
            Dim Destin = JobNode.SelectNodes("Destination")

            Using zip As New ZipFile()
                For Each item As System.Xml.XmlNode In Source
                    zip.AddFile(item.InnerText, JobNode.SelectSingleNode("JobName").InnerText & "_Archive_" & DateString)
                Next

                For Each item As System.Xml.XmlNode In Destin
                    zip.Save(item.InnerText)
                Next
            End Using


            Console.Write(vbCrLf)

            Console.Write(baseDataNode.Name & ": " & baseDataNode.InnerText)
            myLogger.Log(baseDataNode.Name & ": " & baseDataNode.InnerText)
        Next

        Console.Write(vbCrLf)
        Console.Write(vbCrLf)
    Next

    Console.Read()
End Sub[/CODE]

次に、いくつかのルーチン用に作成したJOBという名前のパブリッククラスがあります。

[コード]パブリッククラスの仕事

    Private name As String
    Private source As String
    Private destination As String
    Private timeStamp As String


    Public Property jobName() As String
        Get
            Return name
        End Get
        Set(value As String)
            name = value
        End Set
    End Property
    Public Property jobSource() As String
        Get
            Return source

        End Get
        Set(value As String)
            source = value
        End Set
    End Property
    Public Property jobDestination() As String
        Get
            Return destination
        End Get
        Set(value As String)
            destination = value
        End Set
    End Property
    Public Property jobTimeStamp() As String
        Get
            Return timeStamp
        End Get
        Set(value As String)
            timeStamp = value
        End Set
    End Property[/CODE]
于 2012-12-03T15:01:26.003 に答える