2016-12-01 3 views
1

Это моя первая попытка F #, я знаю, что мне все еще нужно много читать, и я это сделаю, но эти проблемы помогут мне понять следующие части, которые я буду читать лучше, до сих пор мне удалось решить некоторые из первых проблем, поэтому, пожалуйста, будьте терпеливы ......Использование F # как мне получить доступ к элементу, который не имеет того же пространства имен, что и документ?

документ XML выглядит следующим образом:

<BuildCollection xmlns="http://schemas.datacontract.org/2004/07/BuildModels" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    ... 
    <PostEvents xmlns:a="http://schemas.datacontract.org/2004/07/BuildModels.Events"> 
     <a:EventBase i:type="a:ExternalProcess"> 
      <a:Description>Structuring assemblies</a:Description>   

Как получить доступ к элементам, которые начинаются с «а: .......»?

В C# я бы сделал это так:

foreach (var postBuildEventElement in 
    document 
     .Root.Element(ns + "PostEvents") 
     .Elements() 
     .Where(_ => _.Name.LocalName == "EventBase")) 

До сих пор в F # У меня есть это:

module PostBuildInstructions 

open System.Xml.Linq 
open System.Linq 

let xn s = XName.Get(s) 

let PostBuildInstructions (xdoc: System.Xml.Linq.XDocument) = 
    xdoc.Root.Elements(xn "PostEvents").Elements().Where(e => e.) 

let ExecutePostBuildInstructions buildDescriptor = 
    let "I need to enumerate the post build events here" 

В "основной" блока кода я начал с этим: (I» м упором на линии 6 с этим вопросом)

open Log 

[<EntryPoint>] 
let main argv = 
    TryLogArgs argv 
    ReadPostBuildInstructions |> ExecutePostBuildInstructions 
    log "Press enter to exit" 
    System.Console.ReadLine() |> ignore 
    0 // return an integer exit code 
+1

Лямбда-выражения в F # написаны как 'fun x -> ...' Вы пробовали искать? –

+0

Я не спрашиваю о ламдах. Да, я искал свой вопрос, но не ламды, так как это не вопрос. –

+0

В коде F # у вас есть '.Where (e => e.)'. Это не так, как лямбда-выражения написаны в F #. –

ответ

4

использование функции xn не эквивалентно использованию в Версия C#. Функция xn возвращает имя без связанного пространства имен. Однако вы имеете дело с именами в пространствах имен, которые вы должны генерировать имена как таковые.

Ваш C# версия в идеале должна быть такой:

XNamespace ns = "http://schemas.datacontract.org/2004/07/BuildModels"; 
XNamespace a = "http://schemas.datacontract.org/2004/07/BuildModels.Events"; 
var query = doc.Root 
    .Elements(ns + "PostEvents") 
    .Elements(a + "EventBase"); 

F # версия не должна быть сильно отличается:

let ns = XNamespace.Get("http://schemas.datacontract.org/2004/07/BuildModels") 
let a = XNamespace.Get("http://schemas.datacontract.org/2004/07/BuildModels.Events") 
let query = doc.Root.Elements(ns + "PostEvents").Elements(a + "EventBase") 

Но вы можете сохранить их как вызовы функций. Просто убедитесь, что вы связываетесь с правильными пространствами имен для функций.

let xn n = XName.Get(n) 
let ns n = XName.Get(n, "http://schemas.datacontract.org/2004/07/BuildModels") 
let a n = XName.Get(n, "http://schemas.datacontract.org/2004/07/BuildModels.Events") 
let query = doc.Root.Elements(ns "PostEvents").Elements(a "EventBase") 
+0

Большое спасибо. Я не искал улучшения кода C#, но вы также дали мне совет. Потрясающие. –