Было бы полезно, если бы вы могли показать какой-то код, который вы пробовали - кто-то может объяснить, в чем проблема, чтобы вы могли узнать больше, чем когда кто-то просто публикует код, который работает. В любом случае вам нужно будет сослаться на некоторые сборки с помощью System.Xml.Linq
и сначала открыть пространство имен. В F # интерактиве вы можете написать это так (в проекте F # просто используйте диалог Добавить ссылку ):
#r "System.Core.dll"
#r "System.Xml.Linq.dll"
open System.Xml.Linq
При использовании XLinq в F # вам нужна простая служебная функция для преобразования строк в XName
объект (который представляет имя элемента / атрибута). В C # есть неявное преобразование, но, к сожалению, это не работает в F #.
let xn s = XName.Get(s)
Затем вы можете загрузить свой XML-документ, используя класс XDocument
, и использовать метод 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
).
EDIT: Другой способ написать это - использовать выражения последовательности, а затем просто взять первый элемент (это не обрабатывает случай, когда элемент не найден):
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