代码之家  ›  专栏  ›  技术社区  ›  fritzone

如何在F#中使用LINQ to XML提取特定标记?

  •  7
  • fritzone  · 技术社区  · 16 年前

    我有一个XML文件,我在F#中打开它,如下所示:

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

    一旦我有了XDocument,我需要使用LINQtoXML导航它,并提取所有特定的标记。我的部分解决方案是:

    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)
    

    2 回复  |  直到 10 年前
        1
  •  10
  •   MichaelGG    16 年前
    #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"
    

    这将找到“bookmark”的所有子元素。如果只需要直接后代,请使用Elements方法(xd.Root.Elements<| xname“whatever”)。

        2
  •  3
  •   Brian    16 年前

    警告:我以前从来没有做过linq到xml,但是通过查看关于这个主题的其他文章,这个片段有一些F#代码可以编译和执行 某物 ,因此它可以帮助您开始:

    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)))