如果您能展示一些尝试过的代码,将会非常有帮助 - 这样某人就可以解释问题所在,这样您就可以学到比仅仅发布可用代码更多的知识。无论如何,您都需要引用一些包含 System.Xml.Linq
的程序集,并首先打开该命名空间。在 F# 交互式环境中,您可以像这样编写(在 F# 项目中,只需使用添加引用对话框即可):
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