我有一个XML文件,它将输出一个字符串:
<mystring>
<manipulate type="caps">
<string>Hello There!</string>
<repeat times="4">
<string> FooBar</string>
</repeat>
</manipulate>
<string>!</string>
</mystring>
我想创建的字符串是:
HELLO THERE! FOOBAR FOOBAR FOOBAR FOOBAR!
我想解释XML节点并执行某些操作或输出某些字符串。我想要一个干净的方式来做这件事。这只是一个简化的版本,还会有其他功能更复杂的节点,但我需要一些帮助才能开始。
我试着用野村来做,但有点吃力。
我的尝试,它使用递归和映射(我认为函数式编程很优雅:(
需要"nokogiri">
def build_string_from_xml(nodes)
nodes.map { |node|
inner_str = build_string_from_xml(node.xpath("./*"))
case node.name
when "string"
node.content
when "repeat"
if node[:type] == "numbered"
1.upto(node[:times].to_i).map { |i|
inner_str + i.to_s
}.join
else
inner_str * node[:times].to_i
end
when "manipulate"
if node[:type] == "caps"
inner_str.upcase
else
raise ArgumentError, "Don't know that manipulation type: %s" % node[:type]
end
else
raise ArgumentError, "Don't know that tag: %s" % node.name
end
}.join
end
doc = Nokogiri::XML.parse(<<-XML)
<mystring>
<manipulate type="caps">
<string>Hello There!</string>
<repeat times="4">
<string> FooBar</string>
</repeat>
<string>!</string>
</manipulate>
<repeat times="3" type="numbered">
<string> FooBar</string>
</repeat>
</mystring>
XML
p build_string_from_xml(doc.xpath("//mystring/*"))
f = File.open("file.xml")
doc = Nokogiri::XML(f)
f.close
result = []
doc.root.children.each do |node|
if node.name == "string"
result.push(node.inner_text)
repeat = node.children[0]
times = repeat["times"]
for i in 1..times do
result.append(repeat.inner_text)
end
end
...
end
" ".join(result)
类似的东西。老实说,我自己并没有用过野村,但希望这能有所帮助。