2016-05-13 4 views
1

Betrachten Sie die folgende mediaobject KlasseLinq to XML kombinieren Werte

Public Class MediaObject 
    Public Path as String 
    Public File as String 
    Public Sub New(_path as String, _file as String) 
     Path = _path 
     File = _file 
    End Sub 
End Class 

Ich habe die folgende XML (myXML):

Dim mobjects As New List(Of MediaObject) 
    Dim x As XDocument = XDocument.Parse(myxml) 

    mobjects = (From m In x.<records>.<media> Select media = New MediaObject(m.<path>.Value, m.<file>.Value)).ToList() 
:

<records> 
    <media> 
    <path>\\first\path</path> 
    <file>firstfile</file> 
    </media> 
    <media> 
    <path>\\second\path</path> 
    <file>secondfile</file> 
    </media> 
<records> 

eine Liste von MediaObjects ich diese benutzen Sie

Alles ist in Ordnung. Aber jetzt diese neue XML betrachten (wo zweite Datei ein alternative der ersten ist):

<records> 
    <media> 
    <path>\\first\path</path> 
    <file>firstfile</file> 
    <path>\\second\path</path> 
    <file>secondfile</file> 
    </media> 
</records> 

ich entweder von Eigenschaften leicht zu bekommen, aber nicht beide, dh

Dim mobjects As New List(Of MediaObject) 
    Dim x As XDocument = XDocument.Parse(myxml) 

    'here get only the paths 
    Dim r = (From m In x.<records>.<media> Select media = (From t In m.<path> Select New MediaObject(t.Value, Nothing)).ToList()).ToList() 

    mobjects = r(0) 

Wie würde ich mich um in diesem Kontext eine Liste von MediaObjects zu erstellen? (Lassen Sie uns Pfad und Datei Werte in der XML sind in der Reihenfolge und gehen 2 von 2)

Vielen Dank!

UPDATE: Entschuldigung, ich war nicht genau genug. Hier ist das reale Szenario. Es kann viele Pfade und Dateien und es

  • Pfade, bevor Dateien kommen garantiert wird
  • gibt es die gleiche Anzahl von Pfaden und Dateien
  • alle Pfade kommen zuerst, dann werden alle Dateien

Probe :

PS: Ich kann das XML nicht ändern, das von einem anderen System kommt.

..

Antwort

0

Angenommen, Sie sind einfach jeden n-ten Pfad und Datei paaren, können Sie dies tun:

Dim paths = doc...<path> 
Dim files = doc...<file> 
Dim query = paths.Zip(files, Function(p, f) 
    New MediaObject(CType(p, String), CType(f, String)) 
) 

Sie haben nicht einmal über mögliche Elemente kümmern, die dazwischen sind, sie werden einfach ignoriert werden.

+0

Dank Jeff. Sorry, ich war nicht präzise genug, ich habe meine Frage aktualisiert. Trotzdem bin ich mir ziemlich sicher, dass dies der richtige Weg ist, indem ich vielleicht NodesAfterSelf benutze und das Nth File Tag auswähle. – jhfelectric

+0

So paaren Sie jeden n-ten Pfad und Datei, kein Problem. –

+0

Danke das ist perfekt! – jhfelectric