2016-12-01 6 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#에서

내가 이런 식으로 할 것 : 나 '(: "메인"코드 블록에서

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" 

내가이 시작 :

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

을 지금까지 F에 # I이 있습니다 xn 기능의 사용은의 사용에 해당하지

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

나는 램다에 대해 묻지 않습니다. 예, 나는 그 질문이 아니기 때문에 lamdas가 아니라 내 질문을 봤다. –

+0

F # 코드에는'.Where (e => e.) '가 있습니다. 그것은 람다 표현식이 F #에서 작성된 방식이 아닙니다. –

답변

4

)이 질문 6 행에 초점을 맞추고 있어요 C# 버전. xn 함수는 관련된 네임 스페이스가없는 이름을 반환합니다. 그러나 네임 스페이스 내에서 네임을 다루는 경우 네임을 생성해야합니다.

귀하의 C# 버전은 이상적으로 다음과 같이해야한다 :

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") 

하지만 당신은 함수 호출로 유지 할 수 있습니다 :

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 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# 코드의 개선을 기대하지 않고 있지만 팁을 주었다. 굉장해. –