Парсинг F# XML

21
задан Cory Foy 2 December 2008 в 03:02
поделиться

4 ответа

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 с пустой строкой.

48
ответ дан Derek Slager 29 November 2019 в 06:34
поделиться

Вот подобный код, чтобы сделать это в 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()
6
ответ дан JaredPar 29 November 2019 в 06:34
поделиться

При рассмотрении кода у Вас есть несколько вещей, продолжающихся. Первое загружает набор для почтовых узлов, и второе на самом деле делает что-то значимое с ними.

Первый, Вы хотели бы иметь свой возврат функции набор. Что-то как (и я нахожусь на своем 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-минутный обзор ) для получения еще некоторых идей.

1
ответ дан Community 29 November 2019 в 06:34
поделиться

Как насчет чего-то вроде:

#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
1
ответ дан Michal Sznajder 29 November 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: