加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

从“strings / that / are / paths”数组构建XML树(在Ruby中)

发布时间:2020-12-16 23:21:14 所属栏目:百科 来源:网络整理
导读:如果你有一个字符串路径数组,在 Ruby中构建XML树的最佳方法是什么? paths = [ "nodeA1","nodeA1/nodeB1/nodeC1","nodeA1/nodeB1/nodeC1/nodeD1/nodeE1","nodeA1/nodeB1/nodeC2","nodeA1/nodeB2/nodeC2","nodeA3/nodeB2/nodeC3" ] xml = nodeA1 nodeB1 nodeC
如果你有一个字符串路径数组,在 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>paths = [ "nodeA1","nodeA3/nodeB2/nodeC3" ]<nodeA1> <nodeB1> <nodeC1> <nodeD1> <nodeE1/> </nodeD1> </nodeC1> <nodeC2/> </nodeB1> <nodeB2> <nodeC2/> <nodeC3/> </nodeB2> </nodeA1>

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

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

当你遇到这个问题时,你们常常做的任何想法或事情?

谢谢!
长矛

解决方法

REXML是你的朋友!你正在获得XPath,所以使用’em!

require 'rexml/document'

paths = [
  "nodeA1","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 /”更改为“/”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读