2008-10-12 14 views
7

Tengo un archivo XML, que abro en Fa # así:¿Cómo puedo extraer etiquetas específicas usando LINQ to XML en F #?

let Bookmarks(xmlFile:string) = 
    let xml = XDocument.Load(xmlFile) 

Una vez que tengo el XDocument necesito para navegar usando LINQ para XML y extraer todas las etiquetas específicas. Parte de mi solución es:

let xname (tag:string) = XName.Get(tag) 
let tagUrl (tag:XElement) = let attribute = tag.Attribute(xname "href") 
          attribute.Value 
let Bookmarks(xmlFile:string) = 
    let xml = XDocument.Load(xmlFile) 
    xml.Elements <| xname "A" |> Seq.map(tagUrl) 

¿Cómo puedo extraer las etiquetas específicas del archivo XML?

+0

Solo un pequeño detalle, en "let xname (tag: string) = XName.Get (tag)", la anotación tipo de cadena es innecesaria. – MichaelGG

+1

Para el caso, el parámetro completo es innecesario. 'let xname = XName.Get' logra la misma cosa. –

Respuesta

10
#light 
open System 
open System.Xml.Linq 

let xname s = XName.Get(s) 
let bookmarks (xmlFile : string) = 
    let xd = XDocument.Load xmlFile 
    xd.Descendants <| xname "bookmark" 

Esto da como resultado todos los elementos descendientes de "marcador". Si solo desea descendientes directos, use el método Elements (xd.Root.Elements < | xname "whatever").

3

Advertencia: nunca he hecho LINQ-to-xml antes, pero mirando a través de otros mensajes sobre el tema, este fragmento tiene alguna F # código que compila y hace algo, y por lo tanto puede ayudar a empezar:

open System.IO 
open System.Xml 
open System.Xml.Linq 

let xmlStr = @"<?xml version='1.0' encoding='UTF-8'?> 
<doc> 
    <blah>Blah</blah> 
    <a href='urn:foo' /> 
    <yadda> 
     <blah>Blah</blah> 
     <a href='urn:bar' /> 
    </yadda> 
</doc>" 

let xns = XNamespace.op_Implicit "" 
let a = xns + "a" 
let reader = new StringReader(xmlStr) 
let xdoc = XDocument.Load(reader) 
let aElements = [for x in xdoc.Root.Elements() do 
       if x.Name = a then 
        yield x] 
let href = xns + "href" 
aElements |> List.iter (fun e -> printfn "%A" (e.Attribute(href))) 
Cuestiones relacionadas