gpt4 book ai didi

F# 使用 XML Type Provider 修改 xml

转载 作者:行者123 更新时间:2023-12-04 23:16:49 24 4
gpt4 key购买 nike

我需要处理一堆 XML 文档。它们的结构非常复杂(即节点负载),但处理包括更改几个节点的值并以不同的名称保存文件。

我正在寻找一种方法来做到这一点,而不必通过显式实例化所有类型并传入所有未更改的值来重建输出 XML,而只需从输入中复制它们。如果类型提供程序自动生成的类型是记录类型,我可以简单地通过 let output = { input with changedNode = myNewValue } 创建输出,但对于类型提供程序我必须做 let output = MyXml.MyRoot(input.UnchangedNode1, input.UnchangedNode2, myNewValue, input.UnchangedNode3, ...) .由于我更改的值位于某些嵌套节点中,这使情况变得更加复杂,因此我需要传入很多信息来获取它。

最佳答案

F# 数据类型提供程序的主要设计目的是在读取数据时提供轻松访问,因此它们没有很好的写入数据的故事(部分原因是底层 JSON 表示与底层 XML 表示完全不同)。

对于 XML,类型提供程序只是包装标准 XElement类型,碰巧是可变的。这意味着您实际上可以使用提供的类型导航到元素,然后使用底层 LINQ to XML 来改变值。例如:

type X = XmlProvider<"<foos><foo a=\"1\" /><foo a=\"2\" /></foos>">

// Change the 'a' attribute of all 'foo' nodes to 1234
let doc = X.GetSample()
for f in doc.Foos do
f.XElement.SetAttributeValue(XName.Get "a", 1234)

// Prints the modified document
doc.ToString()

这可能并不完美 - 有时,您需要更改父元素(就像这里,提供的 f.A 属性不是可变的),但它可能会起作用。我不知道这是否是解决问题的最佳方法,或者像 XSLT 这样的东西是否更容易 - 这可能取决于具体的转换。

关于F# 使用 XML Type Provider 修改 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39164119/

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