Ruby on rails 如何使用Nokogiri解析XML文档

Ruby on rails 如何使用Nokogiri解析XML文档,ruby-on-rails,ruby,xml,parsing,nokogiri,Ruby On Rails,Ruby,Xml,Parsing,Nokogiri,我正在尝试使用Ruby on Rails中的Nokogiri解析XML文件: <ItemID> <SupplierPartID>GH-CF-BINDER</SupplierPartID> </ItemID> <ItemDetail> <UnitPrice><Money currency="USD"></Money></UnitPrice> <Descr

我正在尝试使用Ruby on Rails中的Nokogiri解析XML文件:

<ItemID>
    <SupplierPartID>GH-CF-BINDER</SupplierPartID>
  </ItemID>
  <ItemDetail>
    <UnitPrice><Money currency="USD"></Money></UnitPrice>
    <Description xml:lang="en">Ghent Contract Furniture Binder</Description>
    <UnitOfMeasure>Each</UnitOfMeasure>
    <Classification domain=""></Classification>
    <Extrinsic name="tag">GH-CF-BINDER</Extrinsic>
    <Extrinsic name="bin_number">103/18/9</Extrinsic>
    <Extrinsic name="billing email"></Extrinsic> 
    <Extrinsic name="bill_code6"></Extrinsic> 
    <Extrinsic name="prodcode"></Extrinsic>
    <Extrinsic name="stock_tag"></Extrinsic> 
    <Extrinsic name="has_imprint">N</Extrinsic> 
    <Extrinsic name="manuf_id">4117</Extrinsic>
    <Extrinsic name="bill_code1"></Extrinsic>

  </ItemDetail>
因此,如上所述,
item_info_params['bill_code1']
将被分配给
name=>bill_code1
,而不是空白值

如何解决这个问题令人困惑

需要“nokogiri”
require 'nokogiri'
xml = '<ItemID><SupplierPartID>GH-CF-BINDER</SupplierPartID><ItemDetail><UnitPrice><Money currency="USD"></Money></UnitPrice><Description xml:lang="en">Ghent Contract Furniture Binder</Description><UnitOfMeasure>Each</UnitOfMeasure><Classification domain=""></Classification><Extrinsic name="tag">GH-CF-BINDER</Extrinsic><Extrinsic name="bin_number">103/18/9</Extrinsic><Extrinsic name="billing email"></Extrinsic><Extrinsic name="bill_code6"></Extrinsic><Extrinsic name="prodcode"></Extrinsic><Extrinsic name="stock_tag"></Extrinsic><Extrinsic name="has_imprint">N</Extrinsic><Extrinsic name="manuf_id">4117</Extrinsic><Extrinsic name="bill_code1"></Extrinsic></ItemDetail></ItemID>'


doc = Nokogiri::XML(xml)
bill_code = doc.xpath('//*[@name="bill_code1"]')[0].content
puts "bill_code: #{bill_code}"
#=> bill_code: 





tag = doc.xpath('//*[@name="tag"]')[0].content
puts "tag: #{tag}"
#=> tag: GH-CF-BINDER
xml='GH CF Binderghen合同家具BinderEachGH-CF-BINDER103/18/9N4117' doc=Nokogiri::XML(XML) bill_code=doc.xpath('/*[@name=“bill_code1”]')[0]。内容 放入“账单代码:{账单代码}” #=>账单代码: tag=doc.xpath('/*[@name=“tag”]')[0]。内容 放置“标记:#{tag}” #=>标签:GH-CF-BINDER
仔细想想:

require 'nokogiri'

EXTRINSIC_NAMES = ['tag', 'bin_number', 'manuf_id']

doc = Nokogiri::XML(<<EOT)
      <ItemDetail>
        <UnitPrice><Money currency="USD"></Money></UnitPrice>
        <Description xml:lang="en">Ghent Contract Furniture Binder</Description>
        <UnitOfMeasure>Each</UnitOfMeasure>
        <Classification domain=""></Classification>
        <Extrinsic name="tag">GH-CF-BINDER</Extrinsic>
        <Extrinsic name="bin_number">103/18/9</Extrinsic>
        <Extrinsic name="billing email"></Extrinsic> 
        <Extrinsic name="bill_code6"></Extrinsic> 
        <Extrinsic name="prodcode"></Extrinsic>
        <Extrinsic name="stock_tag"></Extrinsic> 
        <Extrinsic name="has_imprint">N</Extrinsic> 
        <Extrinsic name="manuf_id">4117</Extrinsic>
        <Extrinsic name="bill_code1"></Extrinsic>

      </ItemDetail>
EOT

item_detail = doc.at('ItemDetail')

extrinsic_values = EXTRINSIC_NAMES.map { |name| 
  [name, doc.at("Extrinsic[name=#{name}]").text]
}.to_h

extrinsic_values 
# => {"tag"=>"GH-CF-BINDER", "bin_number"=>"103/18/9", "manuf_id"=>"4117"}

无论哪种方式,如果XML文件的格式不同,那么您必须在代码中考虑到这一点。

@mudasobwa不起作用。为{“name”=>“bill_code1”}:Hash提供错误“NoMethodError:undefined method`text”:首先如何将其转换为Hash?@Md.FarhanMemon外部标记本身是一个Hash。但是“customer=customer.create(item_info_params)将所有变量作为散列传递给customer。请阅读”“。我们需要一个语法正确、最少的代码示例。对于不同的XML格式,我们无能为力。您必须检查得到的结果,并确定是否可以编写一个脚本来解释差异,还是可以编写多个脚本。那超出了问题的范围。
require 'nokogiri'

EXTRINSIC_NAMES = ['tag', 'bin_number', 'manuf_id']

doc = Nokogiri::XML(<<EOT)
      <ItemDetail>
        <UnitPrice><Money currency="USD"></Money></UnitPrice>
        <Description xml:lang="en">Ghent Contract Furniture Binder</Description>
        <UnitOfMeasure>Each</UnitOfMeasure>
        <Classification domain=""></Classification>
        <Extrinsic name="tag">GH-CF-BINDER</Extrinsic>
        <Extrinsic name="bin_number">103/18/9</Extrinsic>
        <Extrinsic name="billing email"></Extrinsic> 
        <Extrinsic name="bill_code6"></Extrinsic> 
        <Extrinsic name="prodcode"></Extrinsic>
        <Extrinsic name="stock_tag"></Extrinsic> 
        <Extrinsic name="has_imprint">N</Extrinsic> 
        <Extrinsic name="manuf_id">4117</Extrinsic>
        <Extrinsic name="bill_code1"></Extrinsic>

      </ItemDetail>
EOT

item_detail = doc.at('ItemDetail')

extrinsic_values = EXTRINSIC_NAMES.map { |name| 
  [name, doc.at("Extrinsic[name=#{name}]").text]
}.to_h

extrinsic_values 
# => {"tag"=>"GH-CF-BINDER", "bin_number"=>"103/18/9", "manuf_id"=>"4117"}
extrinsic_values = doc.css('Extrinsic').map { |node| 
  [node['name'], node.text]
}.to_h

extrinsic_values 
# => {"tag"=>"GH-CF-BINDER",
#     "bin_number"=>"103/18/9",
#     "billing email"=>"",
#     "bill_code6"=>"",
#     "prodcode"=>"",
#     "stock_tag"=>"",
#     "has_imprint"=>"N",
#     "manuf_id"=>"4117",
#     "bill_code1"=>""}