2017-09-29 112 views
1

我有如下所示的xml文件。我想解析它轉換爲 紅寶石散列。我試圖這樣做:使用Nokogiri將xml轉換爲散列,但保留錨定標記

但它去掉錨標記,我結束了 與描述這樣的事情。 「今天是」

如何將XML轉換爲散列,但保留錨標籤?

代碼:

@doc   = File.open(xml_file) { |f| Nokogiri::XML(f) } 
data   = Hash.from_xml(@doc.to_s) 

XML文件

<blah> 
    <tag> 
    <name>My Name</name> 
    <url>www.url.com</url> 
    <file>myfile.zip</file> 
    <description>Today is a <a href="www.sunny.com">sunny</a></description> 
</tag> 
    <tag> 
    <name>Someones Name</name> 
    <url>www.url2.com</url> 
    <file>myfile2.zip</file> 
    <description>Today is a <a href="www.rainy.com">rainy</a></description> 
</tag> 
</blah> 
+0

爲什麼你需要Nokogiri在這裏?爲什麼不'Hash.from_xml(File.open(xml_file).read)'? – chumakoff

+0

但是不會去掉錨標籤嗎?有沒有辦法保持錨標籤? – user3771782

回答

1

我現在看到的唯一方法是在整個文檔中逃脫裏面<description> HTML,然後執行Hash#from_xml

doc = File.open(xml_file) { |f| Nokogiri::XML(f) } 

# escape HTML inside <description> 
doc.css("description").each do |node| 
    node.inner_html = CGI.escapeHTML(node.inner_html) 
end 

data = Hash.from_xml(doc.to_s) # => 

# {"blah"=> 
# { 
#  "tag"=>[ 
#  { 
#   "name"=>"My Name", 
#   "url"=>"www.url.com", 
#   "file"=>"myfile.zip", 
#   "description"=>"Today is a <a href=\"www.sunny.com\">sunny</a>" 
#  }, 
#  { 
#   "name"=>"Someones Name", 
#   "url"=>"www.url2.com", 
#   "file"=>"myfile2.zip", 
#   "description"=>"Today is a <a href=\"www.rainy.com\">rainy</a>" 
#  } 
#  ] 
# } 
# } 

Nokogiri在這裏僅用於HTML轉義。如果你找到另一種逃避方式,你並不需要它。例如:

xml = File.open(xml_file).read 

# escaping inner HTML (maybe not the best way, just example) 
xml.gsub!(/<description>(.*)<\/description>/, "<description>#{CGI.escapeHTML($1)}</description>") 

data = Hash.from_xml(doc.to_s) 
+0

謝謝!這工作:) – user3771782

+0

@ user3771782你爲什麼不接受答案? – chumakoff

相關問題