如果您可以展示一些您尝试过的代码,这将非常有用 - 然后有人可以解释问题所在,这样您就可以比仅发布有效的代码学到更多。无论如何,您需要使用System.Xml.Linq 引用一些程序集并首先打开命名空间。在 F# 交互中,你可以这样写(在 F# 项目中,只需使用 Add Reference 对话框):
#r "System.Core.dll"
#r "System.Xml.Linq.dll"
open System.Xml.Linq
在 F# 中使用 Xlinq 时,您需要一个简单的实用函数来将字符串转换为 XName 对象(表示元素/属性名称)。 C# 中有一个隐式转换,但遗憾的是这在 F# 中不起作用。
let xn s = XName.Get(s)
然后您可以使用XDocument 类加载您的XML 文档,并使用Element 方法获取单个“父”元素。然后你可以调用Elements 来获取所有嵌套的“属性”元素:
let xd = XDocument.Load("file.xml")
let props = xd.Element(xn "parent").Elements(xn "property")
现在您可以搜索元素以找到具有指定属性值的元素。例如使用Seq.tryFind(这也允许您处理未找到元素的情况):
let nameOpt = props |> Seq.tryFind (fun xe ->
xe.Attribute(xn "name").Value = "firstName")
现在,值nameOpt 的类型为option<XElement>,因此您可以对其进行模式匹配以查看是否找到了该元素(例如Some(el))或是否未找到该元素(None)。
编辑:另一种写法是使用序列表达式,然后只取第一个元素(这不处理未找到元素的情况):
let nameEl =
seq { for el in xd.Element(xn "parent").Elements(xn "property") do
if xe.Attribute(xn "name").Value = "firstName" then yield xe }
|> Seq.head