-5

開けない大きなファイルがあります:

... 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

「 Nokogiri::XML::Reader を使用して大きな XML ファイルを解析するにはどうすればよいですか?」を試しました。

#!/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戻ります{}

要素から属性と内部テキストを抽出するにはどうすればよいですか?

4

2 に答える 2

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 "
    ]
]
于 2013-03-10T16:47:36.283 に答える
-1

でそれを行うこともできますawkが、推奨される方法は XML パーサーです。ともかく:

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

注: 入力ファイル全体に大きく依存するため、これは完璧な解決策ではありません。フィールドセパレーターをタグに設定し、ファイルから2番目と3番目の「列」を出力します。変更する必要がある場合があります。

于 2013-03-08T17:09:58.317 に答える