2016-05-13 3 views
1

Рассмотрим следующий MediaObject классLinq для XML скомбинировать значения

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 

я следующий XML (myxml):

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

Чтобы получить список MediaObjects Я использую это:

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() 

Все в порядке. Но теперь рассмотрим этот новый XML (где второй файл является дублер первого):

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

Я могу легко получить либо из свойств, но не оба, т.е.

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) 

Как я пошел бы создать список MediaObjects в этом контексте? (давайте рассмотрим значения пути и файла в xml в последовательности и идем 2 на 2)

Спасибо!

ОБНОВЛЕНИЕ: Извините, я не был достаточно точным. Вот сценарий реального мира. Там может множество путей и файлов, и это гарантировано

  • пути приходят перед файлами
  • есть одно и то же число путей и файлов
  • все пути приходят первые, то все файлы

Sample :

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

PS: Я не могу изменить XML, который поступает из другой системы. ..

ответ

0

Предполагая, что вы просто спаривание каждого п-й пути и файл, вы можете сделать это:

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

Вам даже не придется беспокоиться о возможных элементах, которые между ними, они будут просто игнорироваться.

+0

Thanks Jeff. Извините, я не был достаточно точным, я обновил свой вопрос. Тем не менее, я совершенно уверен, что это путь, используя, возможно, NodesAfterSelf и выбор N-го файла. – jhfelectric

+0

Итак, вы спариваете каждый n-й путь и файл, никаких проблем. –

+0

Спасибо, что отлично! – jhfelectric

Смежные вопросы