Ruby Nokogiri覆盖问题



以下是我的代码,它仅打印出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)}

相关内容

  • 没有找到相关文章

最新更新