gpt4 book ai didi

xml - 使用 F# linq to XML 解析 XML 文件

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:20 27 4
gpt4 key购买 nike

F#新手

我在 2 个文件夹 c:\root\a\file.xmlc:\root\b\file.xml 中有 2 个 XML 文件>

它们具有相同的结构:

<parent>
<property name="firstName">Jane</property>
<property name="lastName">...</property>
<property name="dateOfBirth">...</property>>
</parent>

我需要选择名称为 firstName 的属性节点值为 Jane 的文件。

在 F# 中(可能通过使用 System.Xml.Linq)我尝试了几种解决方案,但到目前为止都没有用。有人愿意帮忙吗?

最佳答案

如果您可以展示一些您尝试过的代码,那将会很有用 - 然后有人可以解释问题出在哪里,这样您就可以学到比别人只是发布有效代码时更多的知识。无论如何,您需要使用 System.Xml.Linq 来引用一些程序集。并首先打开命名空间。在 F# interactive 中,你可以这样写(在 F# 项目中,只需使用 Add Reference 对话框):

#r "System.Core.dll"
#r "System.Xml.Linq.dll"
open System.Xml.Linq

在 F# 中使用 XLinq 时,您需要一个简单的实用函数来将字符串转换为 XName对象(表示元素/属性名称)。在 C# 中有一个隐式转换,但遗憾的是这在 F# 中不起作用。

let xn s = XName.Get(s)

然后您可以使用 XDocument 加载您的 XML 文档类和使用Element获取单个“父”元素的方法。然后你可以调用Elements获取所有嵌套的“属性”元素:

let xd = XDocument.Load("file.xml")
let props = xd.Element(xn "parent").Elements(xn "property")

现在您可以搜索元素以找到具有指定属性值的元素。例如使用 Seq.tryFind (这也允许您处理未找到元素的情况):

let nameOpt = props |> Seq.tryFind (fun xe -> 
xe.Attribute(xn "name").Value = "firstName")

现在,值 nameOpt类型为 option<XElement>因此您可以对其进行模式匹配以查看是否找到该元素(例如 Some(el) )或是否未找到该元素( None )。

编辑:另一种写法是使用序列表达式,然后只取第一个元素(这不处理找不到元素的情况):

let nameEl = 
seq { for el in xd.Element(xn "parent").Elements(xn "property") do
if xe.Attribute(xn "name").Value = "firstName" then yield xe }
|> Seq.head

关于xml - 使用 F# linq to XML 解析 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315000/

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