Il serait utile si vous pouviez montrer un code que vous avez essayé - quelqu'un peut alors expliquer quel est le problème, vous pouvez en apprendre plus que lorsque le code quelqu'un seulement des messages qui fonctionne . Quoi qu'il en soit, vous devrez référencer certains assemblages avec le System.Xml.Linq
et ouvrir d'abord l'espace de noms. En F # interactive, vous pouvez l'écrire comme celui-ci (dans le projet F #, il suffit d'utiliser Ajouter Référence dialogue):
#r "System.Core.dll"
#r "System.Xml.Linq.dll"
open System.Xml.Linq
Lorsque vous utilisez XLinq en F #, vous avez besoin d'une simple fonction utilitaire pour convertir des chaînes en XName
objet (qui représente un nom d'élément/attribut). Il y a une conversion implicite en C#, mais cela ne fonctionne malheureusement pas en F #.
let xn s = XName.Get(s)
Ensuite, vous pouvez charger votre document XML en utilisant la classe XDocument
et utiliser la méthode Element
pour obtenir un seul élément « parent ». Ensuite, vous pouvez appeler Elements
pour obtenir tous les éléments de « propriété » imbriqués:
let xd = XDocument.Load("file.xml")
let props = xd.Element(xn "parent").Elements(xn "property")
Maintenant, vous pouvez rechercher les éléments pour trouver l'élément un avec la valeur d'attribut spécifié. Par exemple en utilisant Seq.tryFind
(qui vous permet également de gérer le cas où l'élément ne se trouve pas):
let nameOpt = props |> Seq.tryFind (fun xe ->
xe.Attribute(xn "name").Value = "firstName")
Maintenant, la valeur nameOpt
est de type option<XElement>
afin que vous puissiez correspondance de motif sur elle pour voir si l'élément était trouvé (par exemple Some(el)
) ou s'il n'a pas été trouvé (None
).
EDIT: Une autre façon d'écrire est d'utiliser des expressions de séquence, puis il suffit de prendre le premier élément (ce qui ne gère pas le cas lorsque l'élément ne se trouve pas):
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
Maintenant, je me sens stupide! Je pensais que l'utilisation des expressions f # '' query {} '' et linq étaient des points que vous pouviez extraire de la source de données.Donc - impossible comme je le pense - n'y a-t-il aucun moyen de faire une sorte standard de '' query {for foo in xmlBar do ...} ''? – BitTickler
Notez que vous devez également référencer System.Xml s'il n'est pas déjà référencé. – byteit101