LINQ related query

  • Thread starter Thread starter Jackson420
  • Start date Start date
J

Jackson420

Hi

I have a question regarding joining xml files on a key which is present in
all file, following is my code

docFTR is of type XDocument
xdList is List(Of XDocument)
Dim doc = From x In docFTR.Descendants("Data") From i In xdList.GetRange(0,
1) Join d In xdList(0).Descendants("Data") On x.Descendants("Guid").Value
Equals d.Descendants("Guid").Value

i need to programmatically replace xdList(0) with the current XDcoument
which comes from "From i in xdList.getRange(0,2)"

GetRange(0, could be 2 to 10)

Any help is welcome

TIA
Jacko
 
Jackson420 said:
Hi

I have a question regarding joining xml files on a key which is present in
all file, following is my code

docFTR is of type XDocument
xdList is List(Of XDocument)
Dim doc = From x In docFTR.Descendants("Data") From i In xdList.GetRange(0,
1) Join d In xdList(0).Descendants("Data") On x.Descendants("Guid").Value
Equals d.Descendants("Guid").Value

i need to programmatically replace xdList(0) with the current XDcoument
which comes from "From i in xdList.getRange(0,2)"

GetRange(0, could be 2 to 10)

Join d in i.Descendants("Data")
should do but that sounds too obvious maybe.

If that does not help then consider to post some sample data, at least I
am not good at writing queries without seeing some sample data.
 
Here is a sample data of 1 file, you may make 3 more of the same and try to
join them on Guid and create an xml file

<?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>
<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org#</Data>
</Data>
<Data>
<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G146</Data>
</Data>
</ColumnData


Note: the XDocument must not be hard coded in the command

TIA
Jacko
 
Jackson420 said:
Here is a sample data of 1 file, you may make 3 more of the same and try to
join them on Guid and create an xml file

<?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>
<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org#</Data>
</Data>
<Data>
<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G146</Data>
</Data>
</ColumnData

Here is some sample code processing a List(Of XDocument) of the above
structure and creating a merged document:

Dim doc1 As XDocument = <?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>

<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #1</Data>
</Data>
<Data>

<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G146</Data>
</Data>
</ColumnData>

Dim doc2 As XDocument = <?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>

<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #2</Data>
</Data>
<Data>

<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G147</Data>
</Data>
</ColumnData>

Dim doc3 As XDocument = <?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>

<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #3</Data>
</Data>
</ColumnData>

Dim doc4 As XDocument = <?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>

<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G148</Data>
</Data>
</ColumnData>

Dim docs As New List(Of XDocument)()
docs.Add(doc1)
docs.Add(doc2)
docs.Add(doc3)
docs.Add(doc4)

Dim mergedDoc As XDocument = New XDocument( _
New XElement(doc1.Root.Name, _
From data In docs.<ColumnData>.<Data> _
Group data By guid = data.<Guid>.Value Into G =
Group _
Select New XElement("Data", G(0).<Guid>, G.<Data>)))

mergedDoc.Save(Console.Out)

Output is as follows:

<ColumnData>
<Data>
<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #1</Data>
<Data>Sales org #2</Data>
<Data>Sales org #3</Data>
</Data>
<Data>
<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G146</Data>
<Data>G147</Data>
<Data>G148</Data>
</Data>
</ColumnData>

Is that what you want? Or how should the merged document look exactly?
 
Excellent job - on the dot

MANY THANKS
Jacko


Martin Honnen said:
Here is some sample code processing a List(Of XDocument) of the above
structure and creating a merged document:

Dim doc1 As XDocument = <?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>

<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #1</Data>
</Data>
<Data>

<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G146</Data>
</Data>
</ColumnData>

Dim doc2 As XDocument = <?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>

<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #2</Data>
</Data>
<Data>

<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G147</Data>
</Data>
</ColumnData>

Dim doc3 As XDocument = <?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>

<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #3</Data>
</Data>
</ColumnData>

Dim doc4 As XDocument = <?xml version="1.0" encoding="utf-8"?>
<ColumnData>
<Data>

<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G148</Data>
</Data>
</ColumnData>

Dim docs As New List(Of XDocument)()
docs.Add(doc1)
docs.Add(doc2)
docs.Add(doc3)
docs.Add(doc4)

Dim mergedDoc As XDocument = New XDocument( _
New XElement(doc1.Root.Name, _
From data In docs.<ColumnData>.<Data> _
Group data By guid = data.<Guid>.Value Into G = Group
_
Select New XElement("Data", G(0).<Guid>, G.<Data>)))

mergedDoc.Save(Console.Out)

Output is as follows:

<ColumnData>
<Data>
<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #1</Data>
<Data>Sales org #2</Data>
<Data>Sales org #3</Data>
</Data>
<Data>
<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G146</Data>
<Data>G147</Data>
<Data>G148</Data>
</Data>
</ColumnData>

Is that what you want? Or how should the merged document look exactly?
 
Hi Martin

The final requirement is a bit different, i completed it through 2-stage
process, lets see if you can do this

<ColumnData>
<Data>
<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #1|Sales org #2|Sales org #3</Data>
</Data>
<Data>
<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G146|G147|G148
</Data>
</ColumnData>
 
Jackson420 said:
The final requirement is a bit different, i completed it through 2-stage
process, lets see if you can do this

<ColumnData>
<Data>
<Guid>d2152461-5005-4f22-af65-66f1fe734e81</Guid>
<Data>Sales org #1|Sales org #2|Sales org #3</Data>
</Data>
<Data>
<Guid>4bea02ee-f986-423e-a093-71d78f61ea9b</Guid>
<Data>G146|G147|G148
</Data>
</ColumnData>

Yes, that is possible, change the "merge" query to

Dim mergedDoc As XDocument = New XDocument( _
New XElement(doc1.Root.Name, _
From data In docs.<ColumnData>.<Data> _
Group data By guid = data.<Guid>.Value Into G =
Group _
Select New XElement("Data", G(0).<Guid>, New
XElement("Data", String.Join("|", G.<Data>.Select(Function(d)
d.Value).ToArray())))))

(only all on one line).
 
Thanks

Martin Honnen said:
Yes, that is possible, change the "merge" query to

Dim mergedDoc As XDocument = New XDocument( _
New XElement(doc1.Root.Name, _
From data In docs.<ColumnData>.<Data> _
Group data By guid = data.<Guid>.Value Into G = Group
_
Select New XElement("Data", G(0).<Guid>, New
XElement("Data", String.Join("|", G.<Data>.Select(Function(d)
d.Value).ToArray())))))

(only all on one line).
 
Back
Top