xml - 如何使用 F# Data 的 XML Type Provider 访问父节点的属性?

标签 xml f# parent f#-data xmldataprovider

如何使用 F# Data's XML Type Provider 访问父节点的属性?假设我有以下 XML:

<?xml version="1.0" encoding="UTF-16"?>
<ROOT>
    <level1 name="level1Name1" x="8">
        <level2 name="level2Name1" a="8" b="104" />
        <level2 name="level2Name2" a="85" b="140" />
    </level1>
    <level1 name="level1Name2" x="10">
        <level2 name="level2Name3" a="50" b="500" />
        <level2 name="level2Name4" a="376" b="1065" />
        <level2 name="level2Name5" a="10" b="100" />
        <level2 name="level2Name6" a="700" b="700" />
    </level1>
    <level1 name="level1Name3" x="7">
        <level2 name="level2Name7" a="502" b="66" />
    </level1>
</ROOT>

我想在下面的代码中使用它:

open System
open System.Xml.Linq
open FSharp.Data

type myXmlType = XmlProvider<"""<?xml version="1.0" encoding="UTF-16"?><ROOT><level1 name="level1Name1" x="8"><level2 name="level2Name1" a="8" b="104" /><level2 name="level2Name2" a="85" b="140" /></level1><level1 name="level1Name2" x="10"><level2 name="level2Name3" a="50" b="500" /><level2 name="level2Name4" a="376" b="1065" /><level2 name="level2Name5" a="10" b="100" /><level2 name="level2Name6" a="700" b="700" /></level1><level1 name="level1Name3" x="7"><level2 name="level2Name7" a="502" b="66" /></level1></ROOT>""">

let myXml = myXmlType.Parse("""<?xml version="1.0" encoding="UTF-16"?><ROOT><level1 name="level1Name1" x="8"><level2 name="level2Name1" a="8" b="104" /><level2 name="level2Name2" a="85" b="140" /></level1><level1 name="level1Name2" x="10"><level2 name="level2Name3" a="50" b="500" /><level2 name="level2Name4" a="376" b="1065" /><level2 name="level2Name5" a="10" b="100" /><level2 name="level2Name6" a="700" b="700" /></level1><level1 name="level1Name3" x="7"><level2 name="level2Name7" a="502" b="66" /></level1></ROOT>""")

let howToDoIt =
    myXml.GetLevel1s()
    |> Seq.collect (fun L1 -> L1.GetLevel2s())
    |> Seq.tryFind (fun L2 -> L2.b = L1.x * L2.a) // *REMARK
    |> function
    | None -> ""
    | Some L2 -> L2.Name

*备注:L1.x 显然行不通,但我想实现类似的目标。

最佳答案

我认为最简单的方法是在 L1 上使用 Seq.tryPick,内部函数在当前 L1< 的子级中搜索:

myXml.GetLevel1s()
|> Seq.tryPick (fun L1 ->
    L1.GetLevel2s()
    |> Seq.tryFind (fun L2 -> L2.b = L1.x * L2.a))
|> function
| None -> ""
| Some L2 -> L2.Name

关于xml - 如何使用 F# Data 的 XML Type Provider 访问父节点的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22012307/

相关文章:

windows - Qt:父/子链中的多个窗口,父不关闭子?

php - 有什么办法可以在 PHP 中将 json 转换为 xml?

java - 以编程方式将按钮添加到 fragment

java - Eclipse 如何运行 map reduce 作业?

f# - map 函数的后置条件

f# - 使用 Foq 模拟 Microsoft.Extensions.Logging.ILogger

xslt - 在 XSLT 中随机选择一个节点

syntax - F#:为什么我必须为不带参数的函数显式指定 'unit'?

javascript - jquery 获取父对象的父对象

PHP从子窗口向父窗口传递数据