2012-07-11 53 views
0

我想在F#實驗爲我們需要的實用工具之一,其中,我們想通過對XML文件的文件夾,蒐羅並尋找一個特定的標籤。如果找到,然後插入另一個類似的標籤。最後,輸出所有附加標籤已被插入的文件名。但是,我得到了一個編譯錯誤,其中我無法做出很多意義。編譯錯誤抱怨不是值的函數

let configFile = 
    Directory.GetFiles(Path.Combine("rootdir", "relativepath"), @"*.xml")  
    |> Seq.map(fun configFileName -> 
       let xmlNavigator = XPathDocument(configFileName).CreateNavigator() 
       let node = xmlNavigator.SelectSingleNode(@"Product/ABc[@type='xyz']") 
       match node with 
       | null -> "not configuration present" 
       | _ -> 
        let nodeAppender() = node.InsertAfter("<Risk type=""abc1"" methodology=""xyz1""/>") 
        let parentNode = node.SelectAncestors(XPathNodeType.Root, false) 
        parentNode.Current.OuterXml)   
    |> Seq.iter (printfn "%s") 

的編譯錯誤是如下:

This value is not a function and cannot be applied 
+1

你使用'nodeAppender'地方? 'node.InsertAfter'在你調用'nodeAppender'函數之前不會有任何效果。 – pad 2012-07-11 15:45:44

+0

這是一個非常好的點!我刪除了「let nodeAppender()=」,但似乎並不喜歡它。 – Codex 2012-07-11 15:49:56

+1

您可以使用'|> ignore'或'let _ ='來聲明一個未使用的值。關鍵是你應該聲明一個值,而不是函數。 – pad 2012-07-11 15:51:50

回答

2

您的字符串不正確轉義。它應該是:

node.InsertAfter("<Risk type=\"abc1\" methodology=\"xyz1\"/>") 

編輯︰顯然我打字這是因爲布萊恩張貼他的答案。要麼轉義每個引號字符或用@作爲前綴將起作用。

+0

謝謝丹尼爾!這是問題所在。我已經把它撿起來從http://msdn.microsoft.com/en-us/library/dd323829(v=vs.110).aspx – Codex 2012-07-11 15:45:28

+0

在該示例中字符串的前綴是'@'。但是,我喜歡用於XML的新的三引號字符串。 – Daniel 2012-07-11 15:48:07

+0

同意!但不確定三重引號是否可以在LinqPad中使用。因爲我的第一次嘗試是用三個引號。 – Codex 2012-07-11 15:54:51

1

這將有助於指出錯誤的位置是在什麼行/列。

一目瞭然,在nodeAppender,它看起來像你的字符串常量,這意味着它是在一排(而不是一個字符串轉義引號),這可能是事故的原因五個字符串不放過@錯誤。

相關問題