[英]F# XML parsing
這個c#代碼可能不是最有效的,但得到我想要的。
如何在F#代碼中完成同樣的事情?
string xml = " <EmailList> " +
" <Email>test@email.com</Email> " +
" <Email>test2@email.com</Email> " +
" </EmailList> ";
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 ;
}
}
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。
type EmailList = XmlProvider<"""<EmailList><Email>email</Email><Email>email</Email></EmailList>""">
let data = EmailList.Parse("""
<EmailList>
<Email>test@email.com</Email>
<Email>test2@email.com</Email>
</EmailList>
""")
let emailList = data.Emails |> String.concat Environment.NewLine
這是在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()
如果你查看你的代碼,你會發生一些事情。 第一個是為Email節點加載集合,第二個是實際上對它們做一些有意義的事情。
首先,您希望讓函數返回一個集合。 有點像(我在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 to 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.