Ruby on rails 如何使用Nokogiri解析XML文档
我正在尝试使用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
<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"=>""}