我有一个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做到这一点,但我正在努力一点。
答案 0 :(得分:0)
我的尝试,使用递归和映射(我认为函数式编程优雅:)
要求'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/*"))
答案 1 :(得分:-1)
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)
这样的事情。说实话,我自己并没有使用过Nokogiri,但希望这很有帮助。