以下是我的代码,它仅打印出1个记录,而不是文件中的所有记录
中的所有记录file.xpath("//record").each do |node|
$records << {
"id" => node.xpath('id').text,
"first_name" => node.xpath('first_name').text,
"last_name" => node.xpath('last_name').text,
"email" => node.xpath('email').text,
"gender" => node.xpath('gender').text,
"ip_address" => node.xpath('ip_address').text,
"send_date" => node.xpath('send_date').text,
"email_body" => node.xpath('email_body').text,
"email_title" => node.xpath('email_title').text
}
puts $records
end
这是记录的XML文件
<record>
<id>1</id>
<first_name>Adiana</first_name>
<last_name>Paulat</last_name>
<email>apaulat0@technorati.com</email>
<gender>Female</gender>
<ip_address>216.250.245.57</ip_address>
<send_date>2017-05-17T23:04:27Z</send_date>
<email_body></email_body>
<email_title>Up-sized</email_title>
</record>
<record>
<id>2</id>
<first_name>Jaye</first_name>
<last_name>O'Donnelly</last_name>
<email>jodonnelly1@amazon.com</email>
<gender>Male</gender>
<ip_address>15.66.35.144</ip_address>
<send_date>2017-11-09T05:08:56Z</send_date>
<email_body><script>alert('hi')</script></email_body>
<email_title>real-time</email_title>
</record>
这是系统的输出
{"id"=>"1", "first_name"=>"Adiana", "last_name"=>"Paulat", "email"=>"apaulat0@technorati.com", "gender"=>"Female", "ip_address"=>"216.250.245.57", "send_date"=>"2017-05-17T23:04:27Z", "email_body"=>"", "email_title"=>"Up-sized"}
我问了我的家教,他说我在生产线上覆盖了问题,但我找不到。有人可以帮忙吗?
谢谢您在高级
当我将XML写入名为yo.xml
的文件时,并运行此小程序...
require 'nokogiri'
file = Nokogiri::XML(File.open('yo.xml').read())
p file.xpath('//record').size
...我得到1
。一个记录。
这可能是因为您的XML没有单个顶级节点,因此Nokogiri在发现第一个</record>
时假设XML结束了。
当我用<records>...</records>
包装您的内容时,我会得到2
。
我相信问题是因为您在XML文档中有2个根节点,不允许并且不喜欢它(Nokogiri似乎可以解析第一个然后停止(。您所拥有的不是XML文档,而是XML片段,但是Nokogiri确实让您与之合作,您只需要将文件初始化为:
file = Nokogiri::XML::DocumentFragment.parse(xml)
然后您可以使用XPath迭代两个record
元素:
file.xpath("./record").each do |node|
我不是XPATH上最伟大的,但这似乎在起作用,我不确定为什么//record
在使用片段时不起作用。
如果您无法更改传入数据,则可以使用它来获得您正在寻找的东西
Nokogiri::XML::DocumentFragment.parse(xml_string).search('record').each {|record| p Hash.from_xml(record.to_xml)}