簡體   English   中英

F#XML解析

[英]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。

F#Data XML Type Provider一樣

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM