2012-06-21 14 views
7

これはどのような名前がついているのかわかりませんが、それは私の検索を複雑にしています。xmlの名前の値から単純なハッシュに変換する

マイデータファイルOX.session.xmlは、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> 

にありますか?

とにかく、私が望むすべてがそうのように私のRubyコードに1つのハッシュで終わることです:

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

最短であるかもしれない何を、ほとんどのビルトインRubyの方法のように、そのハッシュ読み込みを自動化しますセッションIDの値を更新し、後でプログラムを実行するためにファイルに簡単に戻すことができますか?

私はYAML、REXMLで遊んできましたが、私の(悪い)試用版を印刷していません。名前空間とXMLを解析するためにNokogiriを使用し

+0

It's XMLバインディング(別の言語のオブジェクトへのXMLマッピング)またはXML変換と呼ばれるものです。 – Maarten

答えて

16

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

Rubyのツールボックスには、それらのいくつかのいくつかの良いカバレッジを持っています

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

私はXMLSimpleを使用し、ちょうどXML_INを使用してXMLファイルにロードし、その後宝石が必要になります。

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

の場合あなたはRails環境にいるので、アクティブなサポートを使うことができます:

require ‘active_support’ 
session = Hash.from_xml('session.xml') 
+0

'gem install xml-simple'ありがとう、単純にファイルを保存する' .xml_out'メソッドがあるかどうかをチェックします... – Marcos

+0

xml_outはデータ構造をとるでしょう)、それをXMLエンコーディングで返します。 – ply

+0

Hash.from_xmlはファイル名ではなくxml文字列を取ります... – NobodysNightmare

7

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"} 
+0

ありがとう、私は知らない/あなたが編集してファイルに保存する必要がある実際のキーと値のペアが含まれているルート要素の名前を気にしたくないので、どういうわけか。 – Marcos

関連する問題