10

これが何の名前で通用するのかわからず、それが私の検索を複雑にしています。

私のデータファイルOX.session.xmlは (古い?) 形式です

<?xml version="1.0" encoding="utf-8"?>
<CAppLogin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://oxbranch.optionsxpress.com">
  <SessionID>FE5E27A056944FBFBEF047F2B99E0BF6</SessionID>
  <AccountNum>8228-5500</AccountNum>
  <AccountID>967454</AccountID>
</CAppLogin>

その XML データ形式は正確には何と呼ばれていますか?

とにかく、私が望むのは、次のように Ruby コードで 1 つのハッシュになることだけです。

CAppLogin = { :SessionID => "FE5E27A056944FBFBEF047F2B99E0BF6", :AccountNum => "8228-5500", etc. }   # Doesn't have to be called CAppLogin as in the file, may be fixed

そのハッシュ読み取りを自動化するための最も短く、最も組み込みの Ruby の方法は何ですか?

私は YAML や REXML をいじりましたが、私の (悪い) 試行例はまだ出力したくありません。

4

2 に答える 2

20

これを行うために Ruby で使用できるライブラリがいくつかあります。

Ruby ツールボックスには、それらのいくつかについて十分にカバーされています。

https://www.ruby-toolbox.com/categories/xml_mapping

私は XMLSimple を使用しています。gem を要求し、xml_in を使用して xml ファイルにロードするだけです。

require 'xmlsimple'
hash = XmlSimple.xml_in('session.xml')

Rails 環境にいる場合は、Active Support を使用できます。

require 'active_support' 
session = Hash.from_xml('session.xml')
于 2012-06-21T14:20:11.630 に答える
8

Nokogiriを使用して XML を名前空間で解析します。

require 'nokogiri'

dom = Nokogiri::XML(File.read('OX.session.xml'))

node = dom.xpath('ox:CAppLogin',
                 'ox' => "http://oxbranch.optionsxpress.com").first

hash = node.element_children.each_with_object(Hash.new) do |e, h|
  h[e.name.to_sym] = e.content
end

puts hash.inspect
# {:SessionID=>"FE5E27A056944FBFBEF047F2B99E0BF6",
#  :AccountNum=>"8228-5500", :AccountID=>"967454"}

CAppLogin がルート要素であることがわかっている場合は、少し単純化できます。

require 'nokogiri'

dom = Nokogiri::XML(File.read('OX.session.xml'))

hash = dom.root.element_children.each_with_object(Hash.new) do |e, h|
  h[e.name.to_sym] = e.content
end

puts hash.inspect
# {:SessionID=>"FE5E27A056944FBFBEF047F2B99E0BF6",
#  :AccountNum=>"8228-5500", :AccountID=>"967454"}
于 2012-06-21T14:18:21.500 に答える