gpt4 book ai didi

xml - 从 "strings/that/are/paths"的数组构建 XML 树(在 Ruby 中)

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

如果您有字符串路径数组,在 Ruby 中构建 XML 树的最佳方法是什么?


<code>paths = [
"nodeA1",
"nodeA1/nodeB1/nodeC1",
"nodeA1/nodeB1/nodeC1/nodeD1/nodeE1",
"nodeA1/nodeB1/nodeC2",
"nodeA1/nodeB2/nodeC2",
"nodeA3/nodeB2/nodeC3"
]</code>
xml =
<code><nodeA1>
<nodeB1>
<nodeC1>
<nodeD1>
<nodeE1/>
</nodeD1>
</nodeC1>
<nodeC2/>
</nodeB1>
<nodeB2>
<nodeC2/>
<nodeC3/>
</nodeB2>
</nodeA1></code>

我的第一个想法是将路径字符串拆分为一个数组,并将其深度和内容与前一个数组进行比较,但是如果我到达路径“nodeA1/nodeB1/nodeC1/nodeD1/nodeE1”,当我去回到“nodeA1/nodeB1/nodeC2”,[1] 节点是共同的祖先,但至少我一直这样做的方式是跟踪它是困惑的。

我也想让它递归,这样我就可以在它自己的函数中处理每个嵌套级别,但还没有找到任何半通用的解决方案。

当你们遇到这个问题时,你们有什么想法或通常做的事情吗?

谢谢!兰斯

最佳答案

REXML 是您的 friend !您正在获取 XPath,所以请使用它们!

require 'rexml/document'

paths = [
"nodeA1",
"nodeA1/nodeB1/nodeC1",
"nodeA1/nodeB1/nodeC1/nodeD1/nodeE1",
"nodeA1/nodeB1/nodeC2",
"nodeA1/nodeB2/nodeC2",
"nodeA3/nodeB2/nodeC3"
]

x = REXML::Document.new
x.elements << "xml"

paths.each do |p|
steps = p.split(/\//)
steps.each_index do |i|
unless REXML::XPath.first(x,"/xml/" + steps[0..i]*"/")
REXML::XPath.first(x,"/xml/" + steps[0...i]*"/").elements << steps[i]
end
end
end
puts x.to_s

请注意,您的示例数据在顶层同时具有 nodeA1 和 nodeA3,因此我在这里从一个名为“xml”的根开始。如果“3”是一个拼写错误,而 nodeA1 确实是您的根节点(如您的示例 XML 输出所示),您可以删除“x.elements <<“xml””行并将所有“/xml/”更改为只是“/”。

关于xml - 从 "strings/that/are/paths"的数组构建 XML 树(在 Ruby 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1501366/

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