Linq to Object from XML

duphus

Member
Joined
Dec 26, 2009
Messages
20
Programming Experience
Beginner
Have the following XML

VB.NET:
</assay>
<assay assayid="1234" assayname="name" assaytype="type">
[INDENT]<importfromfile>True</importfromfile>
<directories>
[INDENT]<inputdirectory>
[INDENT]<directoryname>c:\</directoryname>
<extension>*.txt</extension>
<extension>*.csv</extension>
<status/>[/INDENT]
</inputdirectory>
<inputdirectory>
[INDENT]<directoryname>c:\</directoryname>
<extension>*.*</extension>
<status />[/INDENT]
</inputdirectory>[/INDENT]
[INDENT]<outputdirectory>
[INDENT]<directoryname>c:\</directoryname>
<status />[/INDENT]
</outputdirectory>[/INDENT]
</directories>[/INDENT]
</assay>

So created an object Assay and a corresponding list of AssayDirectories with a list of Extensions

Having trouble using linq to populate the object
This works
VB.NET:
 Dim result = From a In doc.<assays>.<assay> Where a.@assayname = assayQuery _
            Select New AssayConfig With { _
                  .AssayName = a.@assayname, _
                  .AssayId = a.@assayid, _
                  .AssayType = a.@assaytype, _
                  .AssayFromFile = Convert.ToBoolean(a.<importfromfile>.Value)}

This throws exceptions because it cannot cast to the list
VB.NET:
Dim inputdir = From a In doc...<assay> Where a.@assayname = assayQuery _
            Select New AssayDirectories With { _
                  .DirectoryName = a.<directories>.<inputdirectory>.<directoryname>.Value, _
                  .DirectoryType = "INPUT", _
                  .Extension = New List(Of Extension)(From ext In a.<directories>.<inputdirectory>.<extension> Where a.@assayname = assayQuery Select ext.ToList), _
                  .Status = a.<directories>.<inputdirectory>.<status>.Value}
 
Thanks for that tip. Whats a better way to set the object public property values from within the class?

i.e. i do this

VB.NET:
Public Sub New(ByVal assayQuery As String)
        'This returns values for individual assay

        Dim doc As XDocument = LoadXmlFile(_dataFilePath, _fileName)
        SetAssayValues(doc, assayQuery)
End Sub

VB.NET:
Private Sub SetAssayValues(ByVal xdoc As XDocument, ByVal assayQuery As String)
	Dim ac = (From a In xdoc...<assay> Where a.@assayname = assayQuery _
            		Select New AssayConfig With { _
                  		.AssayName = a.@assayname, _
                  		.AssayId = a.@assayid, _
                  		.AssayType = a.@assaytype, _
                  		.AssayFromFile = Convert.ToBoolean(a.<importfromfile>.Value)}).FirstOrDefault

        Me.AssayName = ac.AssayName
        Me.AssayId = ac.AssayId
        Me.AssayType = ac.AssayType
        Me.AssayFromFile = ac.AssayFromFile
End Sub


seems like the the last part shouldn't be necessary
 
Last edited:
Rather than do a.Parent.Parent.Attribute("assayname") thing it's cleaner to use XNode.Ancestors

a.Ancestors("NodeName").Attribute("assayname")

a.Ancestors("assay").Attributes("assayname").ToString= assayQuery
or
a.Ancestors("assay").Attributes("assayname") = assayQuery

shows

Warning 5 Runtime errors might occur when converting 'System.Collections.Generic.IEnumerable(Of System.Xml.Linq.XAttribute)' to 'String'.
 
Back
Top