使用Nokogiri提取属性和数据

时间:2013-03-08 17:03:29

标签: ruby xpath nokogiri

我有一个无法打开的大文件:

... more here

<my_element attr1='123'>
... a lot of text and elements here
</my_element>

<my_element attr1='33'>
... a lot of text and elements here
</my_element>

... more here

更新

我尝试了this

#!/usr/bin/ruby
require "rubygems"
require "nokogiri"
require "debugger"
require "awesome_print"

file   = ARGV[0]
reader = Nokogiri::XML::Reader(File.open(file))
reader.each do |node|
  if node.name == "PATDOC"
    debugger
    break
  end
end

但是node.attributes会返回{},我怎样才能从元素中提取属性和内部文本?

2 个答案:

答案 0 :(得分:0)

嗯,你可以用awk来做...但推荐的方法是XML解析器(XPath,无论如何)。无论如何:

awk 'BEGIN {FS="</*my_element[^>]+>"} {print $2, $3}' INPUTFILE

注意:这不是完美的解决方案,例如它真的取决于你的整个输入文件。它的作用是将字段分隔符设置为标记,并从文件中打印第2和第3个“列”。您可能需要修改它。

答案 1 :(得分:0)

通常我们使用Nokogiri来读取整个文件并将其作为DOM处理。我将示例XML包装在另一个节点中,使其成为有效的XML,并使用CSS访问器,因为它们更容易阅读:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<xml>
  <my_element attr1='123'> a lot of text and elements here </my_element>
  <my_element attr1='33'>  a lot of text and elements here </my_element>
</xml>
EOT

doc.search('my_element').map{ |n|
  [ n['attr1'], n.children.text ]
}

看起来像:

[
    [0] [
        [0] "123",
        [1] " a lot of text and elements here "
    ],
    [1] [
        [0] "33",
        [1] "  a lot of text and elements here "
    ]
]

如果你不能这样使用它: