Lan*_*ard 4 ruby xml tree parsing
如果你有一个字符串路径数组,在Ruby中构建XML树的最佳方法是什么?
paths = [
"nodeA1",
"nodeA1/nodeB1/nodeC1",
"nodeA1/nodeB1/nodeC1/nodeD1/nodeE1",
"nodeA1/nodeB1/nodeC2",
"nodeA1/nodeB2/nodeC2",
"nodeA3/nodeB2/nodeC3"
]
xml =
<nodeA1>
<nodeB1>
<nodeC1>
<nodeD1>
<nodeE1/>
</nodeD1>
</nodeC1>
<nodeC2/>
</nodeB1>
<nodeB2>
<nodeC2/>
<nodeC3/>
</nodeB2>
</nodeA1>
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是将路径字符串拆分为一个数组,并将其深度和内容与前一个数组进行比较,但是如果我到达路径"nodeA1/nodeB1/nodeC1/nodeD1/nodeE1",当我回到"nodeA1/nodeB1/nodeC2",[1]节点是共同的祖先,但跟踪它是混乱的,至少我这样做的方式.
我也想让它递归,所以我可以在它自己的函数中处理每个嵌套级别,但还没有达到任何半通用的解决方案.
当你遇到这个问题时,你们常常做的任何想法或事情?
谢谢!长矛
REXML是你的朋友!你正在获得XPath,所以使用'em!
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
Run Code Online (Sandbox Code Playgroud)
请注意,您的示例数据在顶层都有nodeA1和nodeA3,所以我在这里开始使用名为"xml"的根.如果"3"是一个拼写错误,而nodeA1确实是你的根(正如你的示例XML输出所示),你可以删除'x.elements <<"xml"'行并将所有"/ xml /"更改为只是"/".