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



我有一个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)

类似的东西。老实说,我自己并没有用过野村,但希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新