如果您有一个字符串路径数组,在 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>我的第一个想法是将路径字符串拆分为一个数组,并将其深度和内容与前一个数组进行比较,但是如果我到达路径“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.newx.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 endendputs x.to_s请注意,您的示例数据在顶层同时包含 nodeA1 和 nodeA3,因此我从这里开始使用名为“xml”的根。如果“3”是一个错字,并且 nodeA1 确实是您的根(正如您的示例 XML 输出所建议的那样),您可以删除 'x.elements
10-07 14:18