我有一个无法打开的大文件:
... 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
会返回{}
,我怎样才能从元素中提取属性和内部文本?
答案 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 "
]
]
如果你不能这样使用它: