2012-06-21 21 views
7

Tôi không biết tên này đi theo và điều đó làm phức tạp tìm kiếm của tôi.chuyển đổi từ xml tên-giá trị thành băm đơn giản

tập tin dữ liệu của tôi OX.session.xml là trong (cũ?) Hình thức

<?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> 

gì được rằng định dạng dữ liệu XML được gọi là chính xác?

Dù sao, tất cả tôi muốn là để kết thúc với một băm trong mã Ruby tôi như vậy:

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

gì có thể là ngắn nhất, tích hợp trong hầu hết các của Ruby cách để tự động mà băm đọc, theo một cách Tôi có thể cập nhật giá trị SessionID và lưu trữ nó một cách dễ dàng trở lại vào tệp để chạy chương trình sau này không?

Tôi đã chơi thử với YAML, REXML nhưng không muốn in các thử nghiệm mẫu (xấu) của tôi.

+0

Đó là được gọi là liên kết XML (ánh xạ XML tới các đối tượng bằng ngôn ngữ khác) hoặc chuyển đổi XML! – Maarten

Trả lời

16

Có một vài thư viện bạn có thể sử dụng trong Ruby để làm điều này.

của Ruby hộp công cụ có một số vùng phủ sóng tốt của một vài trong số họ:

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

tôi sử dụng XMLSimple, chỉ cần viên ngọc sau đó tải trong file xml của bạn sử dụng xml_in:

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

Nếu bạn đang ở trong môi trường Rails, bạn chỉ có thể sử dụng Hỗ trợ hiện hoạt:

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

'gem install xml-simple' Cảm ơn, tôi sẽ kiểm tra xem phương thức' .xml_out' có đơn giản như thế nào để lưu nó lại đúng ... – Marcos

+0

Yep, xml_out sẽ lấy cấu trúc dữ liệu (Hash, trong trường hợp của bạn) và trả về trong mã hóa XML. – ply

+0

Hash.from_xml nhận chuỗi xml chứ không phải tên tệp ... – NobodysNightmare

7

Sử dụng Nokogiri để phân tích XML với namespace:

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

Nếu bạn biết rằng CAppLogin là phần tử gốc, bạn có thể đơn giản hóa một chút:

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

Cảm ơn, tôi thích ví dụ thứ hai của bạn tốt hơn vì tôi không biết/không muốn quan tâm tên của phần tử gốc sẽ chứa các cặp khóa/giá trị thực tế mà tôi cần chỉnh sửa và lưu lại vào tệp bằng cách nào đó. – Marcos

Các vấn đề liên quan