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

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]节点是共同的祖先,但跟踪它是混乱的,至少我这样做的方式.

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

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

谢谢!长矛

gle*_*ald 5

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 /"更改为只是"/".