<p>this c# code is probably not the most efficient but gets what I want done.  </p>

<p>How do I accomplish the same thing in F# code?</p>

<pre><code>    string xml = " &lt;EmailList&gt; " +
               "      &lt;Email&gt;test@email.com&lt;/Email&gt; " +
               "      &lt;Email&gt;test2@email.com&lt;/Email&gt; " +
               " &lt;/EmailList&gt; ";

    XmlDocument xdoc = new XmlDocument();
    XmlNodeList nodeList;
    String emailList = string.Empty;
    xdoc.LoadXml(xml);
    nodeList = xdoc.SelectNodes("//EmailList");
    foreach (XmlNode item in nodeList)
    {
        foreach (XmlNode email in item)
        {
             emailList +=  email.InnerText.ToString() +  Environment.NewLine ;
        }               
    }
</code></pre>

If you look at your code, you have a couple of things going on. The first is loading the collection for the Email nodes, and the second is actually doing something meaningful with them.
First, you'd want to have your function return a collection. Something like (and I'm on my Mac, so this may not work):
```
```
List<string> EmailAddresses(string xml)
{
    XmlDocument xdoc = new XmlDocument();
    XmlNodeList nodeList;
    String emailList = string.Empty;
    xdoc.LoadXml(xml);
    nodeList = xdoc.SelectNodes("//EmailList");
    foreach (XmlNode item in nodeList)
    {
        foreach (XmlNode email in item)
        {
             yield email.InnerText.ToString();
        }               
    }
}
```
```
Now the question comes around what you want to do with that collection. In your example above, you were concatenating it, or basically storing state.
From a C# perspective, you can then start using things like the answers from
this question
(using LINQ) and
this one
.
From an F# perspective, you now have a list and can simply use the normal procedures for a list like
this one
or
here
.
You can also look at
LINQ to XML
(or at the
5 minute overview
) to get some more ideas.