tags:

views:

36

answers:

1

So my genius predecessor decided to include a 'xml_data' column in the database for an application. I now have to use some information stored in this xml for another application. I am doing a normal query to get the xml out of the db, and am trying to use LINQ to extract the data I need from the XML. Here is some example XML:

<?xml version="1.0"?>
<data>
  <field>
    <name normalized="id_num"></name>
    <value>
      <![CDATA[12345]]>
    </value>
  </field>
  <field>
    <name normalized="blah"></name>
    <value>
      <![CDATA[asdfasdf]]>
    </value>
  </field>
 ...
</data>

since each row has it's own XML document that follows this pattern, I am iterating through the SQL results and trying to extract the value I need from the XML like this:

List<String> collection = new List<String>();
while (sqlreader.Read())
{
    XElement response = XElement.Parse(sqlreader["xml_data"].ToString());
    var name = from field in response.Elements("field")
               where (string)field.Element("name").Attribute("normalized") == "id_num"
               select field.Element("value").Value;
    collection.Add(name.ToString());
}

I know it's not right because I keep getting this back instead of the value I need:

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Xml.Linq.XElement,System.String]

P.S. Please be gentle, I am a Python programmer and am not really familiar with C# or .NET.

+2  A: 

You want name.FirstOrDefault() or name.First() instead of name.ToString(). The former will give you null if it didn't find a field named 'id_num', the latter will throw an exception.

Your LINQ query returns a collection (though in your case, assuming normal data, it'll be a one-item collection).

Jonathan
you are The Man....
W_P