gpt4 book ai didi

xml - 如何使用 F# Data 的 XML 类型提供程序检索 XML 属性 "two nodes deep"?

转载 作者:数据小太阳 更新时间:2023-10-29 02:26:37 25 4
gpt4 key购买 nike

我想检索比方说 (level2 name=) ab 属性level2Name4 在 (level1 name=) level1Name2 使用 F# Data's XML Type Provider来自以下 XML:

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

但是,我无法将 level2 转换/扩展为 map ,也无法从那里检索必要的信息:

open System.Xml.Linq
open FSharp.Data

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

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

let myA, myB =
myXml.GetLevel1s()
|> Seq.filter (fun L1 -> L1.Name = "level1Name2")
|> Seq.initInfinite (fun i L1 -> L1.GetLevel2s())
...

这就是我卡住的地方。这里如何展开/展开/变换level2?然后,如何检索 ab of(level2 name=) level2Name4 在 (level1 name=) level1Name2?

最佳答案

你很接近。 GetXXX() 方法返回数组,因此您需要展平内部层级。您可以使用 Seq.map 的组合,而不是采用生成器函数 (int -> 'T)Seq.initInfiniteSeq.concat,或 Seq.collect 减少一层嵌套:

myXmlType.GetSample().GetLevel1s()
|> Seq.filter (fun L1 -> L1.Name = "level1Name2")
|> Seq.collect (fun L1 -> L1.GetLevel2s())
|> Seq.iter (fun L2 -> printfn "%A %A" L2.A L2.B)

打印

50 500
376 1065
10 10
700 700

编辑 那么您对属性的顺序不感兴趣,而是希望某个特定实例的属性由其名称确定?然后我们必须搜索元素,首先在外层(可能会失败),然后是内部(也可能会失败)。

let myA, myB =
myXmlType.GetSample().GetLevel1s()
|> Seq.tryFind (fun L1 -> L1.Name = "level1Name2")
|> function
| None -> failwith "level1Name2 not found"
| Some L1 ->
L1.GetLevel2s()
|> Seq.tryFind (fun L2 -> L2.Name = "level2Name4")
|> function
| None -> failwith "level2Name4 not found"
| Some L2 -> L2.A, L2.B
// val myB : int = 1065
// val myA : int = 376

Edit2 您可以结合这两种方法:

let myA, myB =
myXmlType.GetSample().GetLevel1s()
|> Seq.filter (fun L1 -> L1.Name = "level1Name2")
|> Seq.collect (fun L1 -> L1.GetLevel2s())
|> Seq.tryFind (fun L2 -> L2.Name = "level2Name4")
|> function
| None -> failwith "level2Name4 not found"
| Some L2 -> L2.A, L2.B

关于xml - 如何使用 F# Data 的 XML 类型提供程序检索 XML 属性 "two nodes deep"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21990024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com