如果你有一个字符串路径数组,在
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 /”更改为“/”.