2008-10-12 19 views
7

Tôi có một tập tin XML, mà tôi mở trong F # như thế này:Làm thế nào tôi có thể trích xuất các thẻ cụ thể bằng cách sử dụng LINQ to XML trong F #?

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

Khi tôi có XDocument tôi cần phải điều hướng nó sử dụng LINQ to XML và trích xuất tất cả các thẻ cụ thể. Một phần giải pháp của tôi là:

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) 

Làm cách nào để trích xuất các thẻ cụ thể từ tệp XML?

+0

Chỉ cần một nitpick, trong "let xname (tag: string) = XName.Get (thẻ)", chú thích kiểu chuỗi là không cần thiết. – MichaelGG

+1

Đối với vấn đề đó, toàn bộ tham số là không cần thiết. 'let xname = XName.Get' hoàn thành điều tương tự. –

Trả lời

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" 

này sẽ tìm thấy tất cả các yếu tố hậu duệ của "bookmark". Nếu bạn chỉ muốn con cháu trực tiếp, hãy sử dụng phương thức Elements (xd.Root.Elements < | xname "bất cứ điều gì").

3

Lưu ý: Trước đây tôi chưa từng thực hiện linq-to-xml, nhưng nhìn qua các bài đăng khác về chủ đề, đoạn mã này có một số mã F # biên dịch và thực hiện một cái gì đó và do đó nó có thể giúp bạn bắt đầu:

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))) 
Các vấn đề liên quan