-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

注意:这不是完美的解决方案,因为它实际上取决于您的整个输入文件。它所做的是将您的字段分隔符设置为标签,并从文件中打印第二个和第三个“列”。您可能需要对其进行修改。

于 2013-03-08T17:09:58.317 回答