如何根据节点内容解析XML并执行操作?

时间:2011-12-03 17:52:47

标签: ruby xml nokogiri

我有一个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做到这一点,但我正在努力一点。

2 个答案:

答案 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,但希望这很有帮助。