let doc = new XmlDocument() in
doc.LoadXml xml;
doc.SelectNodes "/EmailList/Email/text()"
|> Seq.cast<XmlNode>
|> Seq.map (fun node -> node.Value)
|> String.concat Environment.NewLine
, Если Вы на самом деле хотите заключительную запаздывающую новую строку, можно добавить его в карте и String.concat с пустой строкой.
Вот подобный код, чтобы сделать это в F#. Я уверен, что ниндзя F# поднимет лучшую версию здесь через минуту.
open System.Xml
let getList x =
let getDoc =
let doc = new XmlDocument()
doc.LoadXml(x) |> ignore
doc
let getEmail (n:XmlNode) = n.InnerText.ToString()
let doc = getDoc
let build = new System.Text.StringBuilder()
doc.SelectNodes("//EmailList")
|> Seq.cast<XmlNode>
|> Seq.map (fun n -> n.ChildNodes )
|> Seq.map_concat (Seq.cast<XmlNode>)
|> Seq.map(fun (n:XmlNode) -> getEmail n)
|> Seq.iter (fun e -> build.AppendLine(e) |> ignore )
build.ToString()
При рассмотрении кода у Вас есть несколько вещей, продолжающихся. Первое загружает набор для почтовых узлов, и второе на самом деле делает что-то значимое с ними.
Первый, Вы хотели бы иметь свой возврат функции набор. Что-то как (и я нахожусь на своем Mac, таким образом, это не может работать):
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();
}
}
}
Теперь вопрос приходит, что Вы хотите сделать с тем набором. В Вашем примере выше, Вы связывали его, или в основном хранили состояние.
С точки зрения C#, можно тогда начать использовать вещи как ответы от этот вопрос (использующий LINQ) и этот .
С точки зрения F#, Вы теперь имеете список и можете просто использовать нормальные процедуры списка как этот или здесь .
можно также посмотреть LINQ к XML (или в 5-минутный обзор ) для получения еще некоторых идей.
Как насчет чего-то вроде:
#light
open System.Xml
let xml = "..."
let emailList =
let xdoc = new XmlDocument()
xdoc.LoadXml(xml)
let mutable list = []
let addEmail e = list <- e :: emailList
xdoc.SelectNodes("//EmailList")
|> IEnumerable.iter(fun(item:XmlNode) ->
item
|> IEnumerable.iter(fun(e:XmlNode) ->
addEmail e.InnerText; ()))
list